#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...我在测试一些东西发现了这种奇怪的行为。在参数字段中创建对象时,为什么不调用析构函数?是否有任何解决方案,它是否需要,是否存在内存泄漏?
发布于 2014-03-21 18:23:23
首先,当您要使类彼此派生时,应该确保析构函数是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库。
发布于 2014-03-21 18:24:51
new创建的任何东西都需要delete。这里您正在创建temp对象。在传递到函数之前尝试创建。同时制作base destructor virtual。
int main( )
{
Derived y;
Derived2 *d2 = new Derived2();
Derived2::bogus( d2);
delete d2;
return 0;
}https://stackoverflow.com/questions/22566512
复制相似问题