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";
}

我正在尝试将输出获取为:初始化主启动完成

但是得到:初始化主启动

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

你需要使用

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而是根据您的要求打印。

相关内容

  • 没有找到相关文章

最新更新