首页 > 解决方案 > 过早退出和析构函数

问题描述

我正在一个类中编写一个 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)智能指针就不会被释放。为了避免这种情况,我使用了其他对象的析构函数。

这是一个好习惯(对我来说看起来很丑)?还有其他我可以使用的解决方案吗?

提前致谢!

标签: c++

解决方案


这是一个好习惯(对我来说看起来很丑)?

不,在成员函数中调用析构函数通常不是一个好习惯。

还有其他我可以使用的解决方案吗?

当然。这里有几个:

  1. 不要打扰解除分配。“内存泄漏”无关紧要,因为该进程即将终止。请注意,如果析构函数所做的不仅仅是释放内存,那么这可能不是一个选项。还要考虑该App实例可能不是唯一没有被破坏的对象。
  2. 不要使用 过早终止std::exit,而是main正常返回。这是确保所有破坏都得到处理的唯一方法。

推荐阅读