2015-11-03 31 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

是的,我想我只是將可疑屬性轉換爲指針。因爲,正如我所說的,這個問題不會發生在我可以使用調試器的設備上。 –

相關問題