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