我可以显式调用属性析构函数,以便我可以看到哪一个导致问题?

时间:2015-11-03 11:17:11

标签: debugging c++11 destructor explicit-destructor-call

我想这是一个非常讨厌的问题 - 看起来我班级的属性析构函数之一会造成死锁。在类析构函数之后自动调用属性析构函数。我想手动调用它们,并在每一个成功后进行日志记录。

问题只出现在无法使用调试器的设备上,因此我使用的是日志。

Client::~Client() {
    // Stops io service and disconnects sockets
    exit();
    LOG("io_service stopped"<<endl);
    // Destroy IO service
    io_.~io_service();
    LOG("io_service destroyed"<<endl);
}

但上面的代码实际上会导致异常,因为~io_service()被称为两次

有没有办法正确地做到这一点?如果没有,那么调试析构函数的替代方法是什么?

1 个答案:

答案 0 :(得分:1)

您不能像这样改变编译器行为。编译器将扩​​充析构函数以破坏嵌套对象。

您可以做的是将io声明为指针,并使用new动态分配它。然后拨打delete io并监控那里发生的事情。

其他解决方案就是在io析构函数上放置一个断点,并跟踪破坏时发生的情况。这可能是最好的主意。