C ++:如何在main()退出后打印一些文本?

时间:2013-04-19 11:27:12

标签: c++ main

#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

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

4 个答案:

答案 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,而是会根据您的要求进行打印。