在类构造函数中调用atexit函数

时间:2016-02-09 10:32:20

标签: c++

我想在类中使用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;
}

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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