我發現this link我們什麼時候可以使用Connector/C++發佈代碼中的對象?
我知道C++不支持finally
塊的例子,因此,如果檢索數據(例如:在而塊)期間拋出的任何異常,那麼Connection
,Statement
和Result
對象不能釋放。
所以,我不知道這些對象是如何(或何時)發佈的......或者有另一種方法來編寫代碼來釋放它們? P/S:我花了很多時間在諸如Java,C#等其他語言中,因此也許我的思想在某些方面出了問題。如果有什麼不對,請糾正我。
我發現this link我們什麼時候可以使用Connector/C++發佈代碼中的對象?
我知道C++不支持finally
塊的例子,因此,如果檢索數據(例如:在而塊)期間拋出的任何異常,那麼Connection
,Statement
和Result
對象不能釋放。
所以,我不知道這些對象是如何(或何時)發佈的......或者有另一種方法來編寫代碼來釋放它們? P/S:我花了很多時間在諸如Java,C#等其他語言中,因此也許我的思想在某些方面出了問題。如果有什麼不對,請糾正我。
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++中一貫使用的最重要的習慣用法。你自己很難正確地管理資源;當你讓}
爲你做所有的辛苦工作時,這是一件容易的事情。
+1,並請添加關於RAII的注意事項;-) – Frunsi 2011-12-26 04:51:33
哇,鏈接上的示例代碼是錯誤的,關於異常處理。它應該被禁止。 – Frunsi 2011-12-26 04:50:42