你如何确保调用Derived2析构函数?

时间:2014-03-21 18:15:37

标签: c++ destructor

#include <iostream>

using namespace std;

class Base
{
    public:
        Base ( )
        {
            cout << "Inside Base constructor" << endl;
        }

        ~Base ( )
        {
            cout << "Inside Base destructor" << endl;
        }

};

class Derived : public Base
{
    public:    
        Derived  ( )
        {
        cout << "Inside Derived constructor" << endl;
        }

        ~Derived ( )
        {
            cout << "Inside Derived destructor" << endl;
        }
};

class Derived2 : public Base
{
    public:
        static void bogus(Derived2* d)
        {
            cout << "bogus" << endl;
        }

        Derived2  ( )
        {
            cout << "Inside Derived2 constructor" << endl;
        }

        ~Derived2 ( )
        {
            cout << "Inside Derived2 destructor" << endl;
        }
};

int main( )
{
    Derived y;
    Derived2::bogus( new Derived2 ());

    return 0;
}

-

>Inside Base constructor
>Inside Derived constructor
>Inside Base constructor
>Inside Derived2 constructor
>bogus
>Inside Derived destructor
>Inside Base destructor
>Press <RETURN> to close this window...

我正在测试一些东西并发现这种奇怪的行为。为什么在参数字段中创建对象时不会调用析构函数?有没有解决方案,甚至是否需要内存泄漏?

3 个答案:

答案 0 :(得分:4)

首先 - 当你从另一个派生出类时,你应该确保析构函数是virtual。如果你没有,当派生类有其他成员时,你可能会有内存泄漏:

virtual ~Base ( )
{
  cout << "Inside Base destructor" << endl;
}

其次 - 当您使用new分配内存时,不会在创建的对象上调用析构函数,直到您使用delete手动删除它:

int main( )
{
  Derived y;
  Derived2 *ptr = new Derived2();
  Derived2::bogus(ptr);
  delete ptr;
  return 0;
}

如果您在 时不确定要删除对象,请使用std::shared_ptr或在类的析构函数中将其删除,并将其作为参数。请注意shared_ptr仅适用于C ++ 11,如果您使用的是旧版本(就像很多人一样),请尝试使用 boost 库。

答案 1 :(得分:1)

您不在参数字段中创建对象。您在免费商店(也称为堆)上创建一个对象。你必须调用delete来销毁它。对于everey new,必须删除。有内存泄漏!

答案 2 :(得分:1)

new创建的任何内容都需要delete。在这里,您将创建临时对象。在传递给函数之前尝试创建。同时制作base destructor virtual

int main( )
{

  Derived y;
  Derived2 *d2 = new Derived2();
  Derived2::bogus( d2);

  delete d2;

  return 0;
}