2015-11-03 42 views
0

我想这是一个非常讨厌的问题 - 看起来像我的类的属性析构函数创建了死锁。属性析构函数在类析构函数后自动调用。我想手动调用它们并在每一个成功后创建一个日志条目。我可以显式调用属性析构函数,以便我可以看到哪个导致问题?

该问题只出现在设备上,其中调试器无法使用,所以我使用日志代替。

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()被调用两次

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

+0

AFAIK,做类似事情的唯一方法是使用[放置新](http://www.parashift.com/c++-faq/placement-new.html)。 – ikh

+0

您可能具有析构函数并自动调用它,或者有一个常规函数并手动调用它。 –

回答

1

你不能像这样改变编译器的行为。编译器将增加析构函数来破坏嵌套对象。

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

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

+0

是的,我想我只是将可疑属性转换为指针。因为,正如我所说的,这个问题不会发生在我可以使用调试器的设备上。 –

相关问题