首页 > 解决方案 > C++ 中 std::atexit 的替代方法是什么

问题描述

我想在程序关闭但未结束时删除文件。我试图用函数 std::atexit 来做,但如果那是类成员函数,它的参数不能是指向函数的指针。所以我想知道有没有简单的选择?

class User 
{
    std::experimental::filesystem::path file_path;
    std::experimental::filesystem::path & get_file_path();
    void clean_file_path();
    void (User::*x)();
}
int main()
{
    std::experimental::filesystem::path p = user.get_file_path();
    user.x = & User::clean_file_path;
    std::ofstream output(p, std::ios::binary | std::ios::trunc);
    std::atexit(user.x);
}

标签: console

解决方案


你可以在你的类中有一个静态函数,你可以用指向这个静态函数的指针调用“atexit”:

class User
{
public:
    void clean();
    static void cleanStatic();
};

int main()
{
    void (User:: * pClean)() = &User::clean;
    void (*pCleanStatic)() = &User::cleanStatic;

    std::atexit(pCleanStatic);
}

您可以使用“atexit”注册多个函数,但该数量有限制,因此也许只注册一个可以处理所有对象工作的函数是一个更好的解决方案。

还有一件事:pCleanStatic 的类型和 pClean 的类型不一样:

  • pCleanStatic 为 void(*)()
  • pClean 无效(用户::*)()

"atexit" 需要一个 void(*)() 类型的参数。所以只接受 pCleanStatic 作为参数。在 Visual Studio 中,如果您尝试编译代码

std::atexit(pClean);

你会得到以下错误:

error C2664: 'int atexit(void (__cdecl *)(void))': cannot convert argument 1 from 'void (__thiscall User::* )(void)' to 'void (__cdecl *)(void)'

提到两种不同的类型。


推荐阅读