在下面的代碼中,我使用一個包裝對象臨時存儲來自內存中的數據庫的一些東西。我的問題很簡單:如果函數返回提前或拋出異常,是否會調用對象的析構函數?
我可以確定析構函數被調用嗎?我特別擔心的是 a)testCondition
爲真,並且函數早期從構造tempObj
的作用域的內部作用域返回 b)在執行此函數期間發生了一些運行時錯誤(捕捉到更高級)
(作爲一個方面的問題:這是暫時存儲一些數據在我的應用程序的好方法,someFunc()
是保存/當前數據庫的導出功能)
class TempStore
{
public:
TempStore() {/* delete some stuff from a db and store this in memory*/}
~TempStore() {/* write this stuff back into the db*/}
};
void someFunc(bool testCondition)
{
TempStore tempObj = TempStore();
// some code
if (testCondition)
return; //early return
// some more code
}
您是否嘗試添加日誌(例如printf或寫入文件)並進行調試?在你顯示的代碼中,析構函數將被調用。 – 2014-09-10 14:55:48
運行時錯誤是什麼意思? C++異常?然後它會工作。如果你的程序真的失敗了,seg故障等,那麼它將無法工作。 – mkaes 2014-09-10 14:57:12
是的,當'someFunc()'函數返回時,假定「正常」程序執行(*例如*沒有崩潰或分段錯誤),'TempStore'的析構函數將被調用。這被稱爲[「資源獲取初始化」(RAII)習語](https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization),它是現代C++的基石。 – 2014-09-10 15:02:05