析构函数被调用两次,而没有复制构造函数或赋值运算符被调用

Pet*_*Lee 7 c++ destructor

我有一节课:

class A
{
public:
    A()
    {
        std::cout << "Constructor called" << std::endl;
    }

    ~A()
    {
        std::cout << "Destructor called" << std::endl;
    }

    A(const A& another)
    {
        std::cout << "Copy constructor called" << std::endl;
    }

    A& operator=(const A& another)
    {
        std::cout << "Assignment operator= called" << std::endl;
    }
};
Run Code Online (Sandbox Code Playgroud)

在我非常复杂的项目中,我在启动应用程序后获得了以下输出:

Constructor called
Run Code Online (Sandbox Code Playgroud)

但是当我按Ctrl + C终止我的应用时:

Destructor called
Destructor called
Run Code Online (Sandbox Code Playgroud)

并且在整个过程中,没有调用复制构造函数或赋值运算符.

我的类A有动态内存分配,我必须在析构函数中释放它,但析构函数以某种方式被调用两次,这非常糟糕.

我不知道是什么原因导致了这个问题.

我用Google搜索并搜索了很多.关于"析构函数被调用两次"的许多问题是由于复制构造函数(赋值运算符)的隐式调用.

谢谢.

彼得

Eri*_*son 4

如果您以某种方式调用析构函数两次,也许您有两个对象认为它们通过指针拥有它。

如果确实有两个对象认为它们拥有这个对象,请考虑使用引用计数指针(例如 Boost::shared_ptr 或 tr1::shared_ptr)来包含它。这样你就不用担心最后谁调用了析构函数。

除了调试器之外,您还可以尝试 Valgrind (memcheck) 来查找程序删除已释放对象的位置。在这种情况下,它可能不会提供比调试器更多的细节,但您迟早应该学会使用 Valgrind (memcheck)。

另一个偏执的策略是确保在删除内部指针后将它们设置为 NULL。