【问题标题】:C++: How to print some text after main() exited?C++:main() 退出后如何打印一些文本?
【发布时间】:2013-04-19 11:27:11
【问题描述】:
#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

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

【问题讨论】:

  • 您必须调用 delete 才能进入动态实例化对象的析构函数。

标签: c++ main


【解决方案1】:

你需要使用

static Derived obj;  

而不是

static Derived *obj=new Derived();  

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

【讨论】:

    【解决方案2】:
    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";
    }
    

    【讨论】:

    • @SanderDeDycker:如果您特别想要额外的间接级别,可以。不过,我无法想象你为什么会想要那个。
    【解决方案3】:

    不要使派生对象成为指针。由于 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());
    

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2014-02-16
        • 2023-04-09
        • 1970-01-01
        • 2014-03-06
        • 1970-01-01
        • 2015-06-21
        • 2014-07-23
        • 2020-08-08
        • 1970-01-01
        相关资源
        最近更新 更多