3
#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";

}

我正在尝试将输出设为: Initialize MainStarted Finalize

但是得到: 初始化 MainStarted

我试图调试,但它没有进入析构函数。所以我无法解决这个问题。

4

4 回答 4

4

你需要使用

static Derived obj;  

代替

static Derived *obj=new Derived();  

现在您使用 new 创建对象,并且永远不会调用 delete,因此永远不会正确删除对象。
或者,boost::scoped_ptr如果出于某种原因需要堆分配对象,则可以使用。

于 2013-04-19T11:30:49.887 回答
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";
}
于 2013-04-19T11:31:14.923 回答
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());

选择一个(最好是第一个)。

编辑:但在你做任何这些之前,你应该给出一个使用该全局变量的很好的理由。

于 2013-04-19T11:35:16.450 回答
0

您正在使用static Derived *obj=new Derived(),但不是使用,而是static Derived obj1根据您的要求打印。

于 2013-04-19T12:14:32.540 回答