#include <iostream>
#include <fstream>
#include <cstdio>
using namespace std;
class Derived
{
public:
Derived()
{
cout<< "Initialize...n";
}
~Derived()
{
cout<< "Finalize...n";
}
};
static Derived *obj=new Derived();
int main()
{
cout<<"Main Started::n";
}
我正在尝试将输出获取为:初始化主启动完成
但是得到:初始化主启动
我试图调试,但它没有进入析构函数。所以我无法解决这个问题。
你需要使用
static Derived obj;
而不是
static Derived *obj=new Derived();
现在你用new创建对象,并且从不调用删除,因此对象永远不会被正确删除。
或者,如果出于某种原因需要堆分配对象,则可以使用 boost::scoped_ptr
。
static Derived *obj=new Derived();
这是一个泄漏 - 对象具有动态存储持续时间(因为您是使用 new
创建的(,并且不会删除它,因此它永远不会被销毁。
如果您希望它被自动销毁,请为对象提供静态存储持续时间:
static Derived obj;
或者,您可以使用 std::atexit
注册要在程序退出时调用的任意函数,而不是使用析构函数定义类:
#include <iostream>
#include <cstdlib> // for atexit
void goodbye() {std::cout << "Goodbyen";}
int main() {
std::atexit(goodbye);
std::cout << "Hellon";
}
不要使派生对象成为指针。由于C++不是java,因此在您的情况下几乎不需要new
。但是,如果您在堆上创建Derived
,则必须通过使用 RAII(即智能指针(确保它被正确销毁。在你的代码中,你有一个内存泄漏,*obj
的析构函数永远不会被调用。
如何正确操作的示例:
static Derived obj; //non-heap version
//C++03 auto_ptr, now deprecated:
static std::auto_ptr<Derived> obj(new Derived());
//C++11 smart pointers:
static std::unique_ptr<Derived> obj(new Derived());
static auto obj = std::make_shared<Derived>();
//Boost smart pointers, C++03 compatible:
static boost::shared_ptr<Derived> obj = boost::make_shared<Derived>();
static boost::scoped_ptr<Derived> obj(new Derived());
选择一个(最好是第一个(。
编辑:但在你做任何这些之前,你应该给出一个很好的理由来使用该全局变量。
您正在使用static Derived *obj=new Derived()
但不是使用static Derived obj1
而是根据您的要求打印。