我能否显式调用 属性 析构函数,以便我可以看到是哪一个导致了问题?
Can I explicitly invoke property destructors so that I can see which one causes problems?
我想这是一个非常讨厌的问题 - 似乎我的 class 的 属性 析构函数之一造成了死锁。 属性 个析构函数在 class 个析构函数之后自动调用。而且我想手动调用它们并在每个成功后创建一个日志条目。
问题只出现在设备上,无法使用调试器,所以我改用日志。
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()
被调用 两次 。
那么有没有办法正确地做到这一点?如果不是,调试析构函数的替代方法是什么?
你不能那样改变编译器的行为。编译器将扩充析构函数来析构嵌套对象。
你可以做的是将io
声明为一个指针并用new
动态分配它。然后调用 delete io
并监视那里发生的情况。
其他解决方案只是在 io
析构函数上放置一个断点,然后跟踪销毁时发生的情况。这可能是最好的主意。
我想这是一个非常讨厌的问题 - 似乎我的 class 的 属性 析构函数之一造成了死锁。 属性 个析构函数在 class 个析构函数之后自动调用。而且我想手动调用它们并在每个成功后创建一个日志条目。
问题只出现在设备上,无法使用调试器,所以我改用日志。
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()
被调用 两次 。
那么有没有办法正确地做到这一点?如果不是,调试析构函数的替代方法是什么?
你不能那样改变编译器的行为。编译器将扩充析构函数来析构嵌套对象。
你可以做的是将io
声明为一个指针并用new
动态分配它。然后调用 delete io
并监视那里发生的情况。
其他解决方案只是在 io
析构函数上放置一个断点,然后跟踪销毁时发生的情况。这可能是最好的主意。