#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";
}
我试图将输出设为: 的初始化 MainStarted 完成
但是得到: 的初始化 MainStarted
我试图调试,但它没有进入析构函数。所以我无法解决这个问题。
答案 0 :(得分:4)
您需要使用
static Derived obj;
而不是
static Derived *obj=new Derived();
现在您使用new创建对象,并且从不调用delete,因此永远不会正确删除对象
或者,如果由于某种原因需要堆分配的对象,则可以使用boost::scoped_ptr
。
答案 1 :(得分:4)
static Derived *obj=new Derived();
这是一个泄漏 - 该对象具有动态存储持续时间(因为您使用new
创建了它),并且没有任何删除它,因此它永远不会被销毁。
如果您希望自动销毁它,请为对象提供静态存储持续时间:
static Derived obj;
或者,不是使用析构函数定义类,而是可以使用std::atexit
注册在程序退出时调用的任意函数:
#include <iostream>
#include <cstdlib> // for atexit
void goodbye() {std::cout << "Goodbye\n";}
int main() {
std::atexit(goodbye);
std::cout << "Hello\n";
}
答案 2 :(得分:0)
不要将派生对象作为指针。由于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());
选择一个(第一个,最好是)。
编辑:但在您执行上述任何操作之前,您应该给出使用该全局变量的充分理由。
答案 3 :(得分:0)
您使用的是static Derived *obj=new Derived()
,但不会使用static Derived obj1
,而是会根据您的要求进行打印。