2011-12-26 47 views
0

我發現this link我們什麼時候可以使用Connector/C++發佈代碼中的對象?

我知道C++不支持finally塊的例子,因此,如果檢索數據(例如:在塊)期間拋出的任何異常,那麼ConnectionStatementResult對象不能釋放。

所以,我不知道這些對象是如何(或何時)發佈的......或者有另一種方法來編寫代碼來釋放它們? P/S:我花了很多時間在諸如Java,C#等其他語言中,因此也許我的思想在某些方面出了問題。如果有什麼不對,請糾正我。

+1

哇,鏈接上的示例代碼是錯誤的,關於異常處理。它應該被禁止。 – Frunsi 2011-12-26 04:50:42

回答

3

C++沒有finally塊,因爲它不需要它們。它有很多,更好:析構函數。

一個類型的對象可以有一個析構函數,當這個類型對象的實例不存在的時候,這個析構函數將被調用。具有所謂的「自動存儲持續時間」的局部變量在它們被聲明的塊的末尾不再存在。

因此應該使用析構函數來管理資源。而不是在塊的末尾寫入delete表達式以銷燬動態分配的對象,您應該使用智能指針來管理對象的生命週期。例如,考慮從示例程序以下行到您鏈接:

{ 
    sql::Connection* con; 
    // ... 
    con = driver->connect("tcp://127.0.0.1:3306", "root", "root"); 
    // ... 
    delete con; 
} 

這可能不是可以寫爲:

{ 
    // ... 
    std::unique_ptr<sql::Connection> con(
     driver->connect("tcp://127.0.0.1:3306", "root", "root")); 
    // ... 
} // con is automatically deleted here, even if an exception is thrown. 

(如果您使用的是較舊的編譯器或C++標準庫實現並且您沒有或不能使用std::unique_ptr,您可以在此特定用例中使用std::auto_ptr)。

請注意,此處連接對象的生命週期是自動管理的:您不必記住d銷燬對象,如果拋出異常,則不必擔心執行特殊清理。析構函數將確保連接對象被銷燬。

這種使用析構函數來執行資源清理的技術叫做資源獲取初始化(RAII),它是理解和在C++中一貫使用的最重要的習慣用法。你自己很難正確地管理資源;當你讓}爲你做所有的辛苦工作時,這是一件容易的事情。

+0

+1,並請添加關於RAII的注意事項;-) – Frunsi 2011-12-26 04:51:33

相關問題