【问题标题】:calling atexit function within a class constructor在类构造函数中调用 atexit 函数
【发布时间】:2016-02-09 10:32:20
【问题描述】:

我想在类中使用 std::atexit 函数来清理异常终止。 我正在类构造函数中注册函数句柄,但出现错误。 (codetest.cpp:12:25:错误:非静态成员函数的使用无效) 这是我的简单理解代码(其他是一个大项目,应用程序在一些致命错误时退出,但我需要清理 mu 类的一些属性)

#include <iostream>
#include <iomanip>
#include <stdlib.h>
using namespace std;

class cleanUP
{
public:
    cleanUP ()
    {
        atexit (atexit_handler);
    }
    ~cleanUP()
    {

    }

    void atexit_handler ()
    {
        // Will cleanup some temp files and malloc things.
        cout << "Call atexit" <<endl;
    }
};

int main () {
  cleanUP cleanup;
}

还有其他好的清理方法吗? 谢谢。

【问题讨论】:

标签: c++


【解决方案1】:

您的问题是std::atexit 只能从类中注册一个真正的(未绑定的)函数或静态方法,而不能注册非静态方法。

如果您不需要指向对象的指针,最简单的方法是将处理程序设为静态:

static void atexit_handler ()
{
    // Will cleanup some temp files and malloc things.
    cout << "Call atexit" <<endl;
}

但无论如何,如果您创建多个对象,您将多次注册相同的处理程序,这至少是无用的。如果您真的想(或需要)这样做,您应该:

  • 确保使用静态保护变量(如果您希望线程安全,还可以使用互斥锁或其他关键部分)只注册一次处理程序
  • 在标准容器中注册需要处理的对象,该容器将成为类的静态成员
  • 让静态处理程序处理注册的对象

但惯用的清理方式是简单地使用析构函数并确保在程序退出之前正确删除所有动态对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-07
    • 2019-03-14
    • 2018-03-31
    • 2016-07-19
    • 2015-12-18
    • 2023-04-03
    • 2017-12-12
    • 2018-07-21
    相关资源
    最近更新 更多