c++ - 过早退出和析构函数
问题描述
我正在一个类中编写一个 linux 守护程序,它是一个 App 类的智能指针:
应用程序.hpp
class App
{
public:
App(void)
{
this->ptrDaemon = std::make_unique<Daemon>();
this->ptrDaemon->ptrApp = this;
}
~App(void) = default;
// Members
public:
std::unique_ptr<Daemon> ptrDaemon = nullptr; // This is constructed in the constructor
};
守护进程.hpp
class Daemon
{
~Daemon() = default;
App *ptrApp = nullptr; // This pointer is assigned to the app instance in the App constructor
bool daemonise()
{
pid_t pid{};
pid = fork();
if (pid < 0)
{
return false;
}
// Exit father
if (pid > 0)
{
this->ptrApp->~App(); // This works, but is it a good practice?
std::exit(EXIT_SUCCESS);
}
// More code
}
}
在这种情况下,我需要提前退出父进程,所以如果我使用std::exit(0)
智能指针就不会被释放。为了避免这种情况,我使用了其他对象的析构函数。
这是一个好习惯(对我来说看起来很丑)?还有其他我可以使用的解决方案吗?
提前致谢!
解决方案
这是一个好习惯(对我来说看起来很丑)?
不,在成员函数中调用析构函数通常不是一个好习惯。
还有其他我可以使用的解决方案吗?
当然。这里有几个:
- 不要打扰解除分配。“内存泄漏”无关紧要,因为该进程即将终止。请注意,如果析构函数所做的不仅仅是释放内存,那么这可能不是一个选项。还要考虑该
App
实例可能不是唯一没有被破坏的对象。 - 不要使用 过早终止
std::exit
,而是main
正常返回。这是确保所有破坏都得到处理的唯一方法。
推荐阅读
- python - 用一个简单的语句制作两个条件/循环语句在一条 python 行中工作
- makefile - 试图理解为什么 make 失败
- mysql - 通过 vsts 调用表达式返回以代码“1”退出
- amazon-web-services - 将云端请求重定向到新 URL
- angular - PrimeNg 饼图 - 默认显示所有工具提示?
- android - 在 Room 中链 2 @Query 命令
- javascript - 当我单击按钮时,我不知道出了什么问题
- javascript - 我正在实施一个项目,我必须接受所有 url 请求
- php - 数据表中的总和是多少?PHP
- zooming - Mapbox:如何从 Mapbox 获取缩放级别的比例?