为什么我的析构函数被调用,我该如何解决它

这个问题在这里已经有了答案:

  • 什么是三项规则? 8个答案

  • 当你这样做

    foo=creature(choice);
    

    在作业的RHS上创建临时creature对象。 它的析构函数在声明完成后即被调用,即在行尾。

    没有什么可修复的,但是你可以在choice阅读之后初始化foo ,而不是默认初始化,然后分配:

    int choice;
    
    cout<<"enter 1 2 or 3 to choose ur monster"<<endl;
    cin>>choice;
    
    creature foo(choice);
    

    正如juanchopanza在他的回答中指出的那样

    foo = creature(choice);
    

    在将其分配给foo之前创建一个临时生物对象。 如果您不希望发生这种情况,请使用

    creature foo(choice);
    

    要添加到其他答案,你的问题提到“修复析构函数”。 没有什么可以解决的,但是由于析构函数被调用,你可能会尝试完成一个bug。

    您当前的代码会发生什么情况是临时副本可能会在您未跟踪它们的情况下创建。 当它们的析构函数被调用时,你会不经意地减少count变量,可能会给count一个负值。

    如果您希望对象静态count成员变量正确地反映创建和销毁的对象数量,那么您的类缺少用户定义的复制构造函数来跟踪实例的数量。

    您需要添加此功能。

    class creature{
    public:
        creature(const creature& c) : 
             name(c.name), happy_level(c.happy_level) { ++count; }
    };
    

    此功能将在您进行复印或分配时被调用。

    现场示例:

    (原始代码):http://coliru.stacked-crooked.com/a/ea9821e622aa4cdc

    (更改的代码):http://coliru.stacked-crooked.com/a/b774a896377bdf97

    唯一的区别是,原始代码将复制构造函数注释掉,而更改后的代码具有完整的复制构造函数。

    请注意,在原始代码中,我想知道有多少个对象被创建和销毁,但是当最终对象被销毁时,我得到了-1的结果。 这是不正确的,因为显然结果应该为0,意味着所有的生物都被销毁。

    已更改的代码显示正确的编号,这是因为已考虑临时生物的对象创建。

    链接地址: http://www.djcxy.com/p/73179.html

    上一篇: Why is my destructor being called and how can I fix it

    下一篇: Double free or corruption when using destructor