当前位置: 首页 > 知识库问答 >
问题:

使用atexit()时不为本地对象调用析构函数

梁俊智
2023-03-14
class Static {
public:
    ~Static() 
        {
        std::cout << "Static dtor\n";
        }
    };
class Sample {
public:
    ~Sample() 
        {
        std::cout << "Sample dtor\n";
        }
    };

class Local {
public:
    ~Local() 
        {
        std::cout << "Local dtor\n";
        }
    };

Static static_variable; // dtor of this object *will* be called
void atexit_handler()
    {
    std::cout << "atexit handler\n";
    }
int main()
    {
    Local local_variable; 
    const int result = std::atexit(atexit_handler); 
    Sample static_variable; // dtor of this object *will not* be called
    std::exit(EXIT_SUCCESS);//succesful exit
    return 0;
    }

共有1个答案

双子民
2023-03-14

调用析构函数不是关于atexit,而是关于exit

我一般不认为std::exit有什么好的C++编程。实际上,这和std::atexit

extern "C"   int atexit( void (*func)() ); // in <cstdlib>

来自C标准库。在查看您的示例时,我相信您已经看到了http://en.cppreference.com/w/cpp/utility/program/exit,您还看到了

Static static_variable; 

int mainactual()
{
    Local local_variable; 
    Sample static_variable;
    throw std::exception("EXIT_FAILURE"); // MS specific
    // ... more code
}
int main()
{
    try 
    { 
        mainactual() 
    }catch ( std::exception & e )
    {
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}
 类似资料:
  • 我是C++的新手,我写了一个小程序来了解赋值如何处理对象。这个页面(http://www.cplusplus.com/doc/tutorial/classes2/)的cpp文档提示我这样做。在这一页上,它指出: 隐式版本[复制赋值操作符]执行浅层复制,这适用于许多类,但不适用于具有指向对象的指针的类,这些对象处理其存储。在这种情况下,不仅类会冒两次删除指向对象的风险,而且赋值会通过在赋值之前不删除

  • 假设我有一个固定的内存缓冲区 我使用新的布局在缓冲区中分配我的结构 我知道我应该手动调用这些分配项的析构函数,但如果没有涉及簿记/资源管理,可以忽略这个吗?换句话说,如果使用缓冲区的类的析构函数没有做任何事情(类似于上面的),可以跳过这一步吗?如果是这样,我可以重用缓冲区而不破坏以前的租户吗?

  • 更新1:根据建议添加了打印“this”。 更新2:拆分成几个文件,尝试阻止gcc优化。 更新3:记录复制构造函数并输入添加函数。 更新4:在main中添加了Clang和第二个cout的输出。 我希望参数析构函数作为函数中的最后一条语句被调用。从今以后,我希望下面的代码能够提供以下输出。 使用MSVC(Visual Studio)时,输出与预期的一样。但GCC(4.8.2-19ubuntu1)输出以

  • 构造函数与析构函数是自动调用的。这些函数的调用顺序取决于执行过程进入和离开实例化对象范围的顺序。一般来说,析构函数的调用顺序与构造函数相反。但图6.9将介绍对象存储类可以改变析构函数的调用顺序。 全局范围中定义的对象的构造函数在文件中的任何其他函数(包括 main)执行之前调用(但不同文件之间全局对象构造函数的执行顺序是不确定的)。当main终止或调用exit函数时(见第18章)调用相应的析构函数

  • 问题内容: 给出以下代码: 我的IDE没有给我任何错误。也就是说,直到我尝试构建项目并运行它。当我这样做时,它给了我一个看起来像这样的编译器错误: 现在,我得到了错误消息,如果foo()是静态的,则不会发生这种情况。没错,这仅在foo()是实例方法的情况下才会发生。并且仅当LocalFoo是实例方法中的本地类时才发生,并且仅当使用构造函数引用时(即从不使用常规方法引用)才发生。 更重要的是,如果我

  • 问题内容: 我试图用一个,但不幸的是它似乎并没有工作时。这是一些示例代码: 此代码的输出是: 我希望可以在和被调用时调用,并且输出将类似于(强调)!: 为什么这不起作用,并且当a终止时是否有更好的方法(从上下文)记录消息? 感谢您的输入-非常感谢。 编辑: 根据亚历克斯·马特利(Alex Martelli)建议的解决方案,以下工作可预期进行: 值得在文档中注意以下注释: 注意:当程序被信号杀死,检