使用對象管理資源
在利用對象指針的時候,最後需要刪除對象指針,實現內存釋放,但是有可能在最後的時候,coder忘記釋放了。
void f()
{
Investment *pInv = createInvestment(); // call factory function
... // use pInv
delete pInv; // release object
}
有可能在delete之前,return了,所以解決這個問題,最好是在析構函數內釋放,這樣 標準庫裏的auto_ptr就起到作用,
void f()
{
std::auto_ptr<Investment> pInv(createInvestment()); // call factory
// function
... // use pInv as
// before
} // automatically
// delete pInv via
// auto_ptr's dtor
不過要注意的一點就是,不能讓多個 auto_ptr 指向同一個對象,否則一旦有一個auto_ptr被自動釋放之後,對象就不存在了(未定義),不過放心,爲了防止這個問題,auto_ptrs 具有不同尋常的特性:拷貝它們(通過拷貝構造函數或者拷貝賦值運算符)就是將它們置爲空(拷貝的時候自動將被拷貝的指針置空)。
sstd::auto_ptr<Investment> // pInv1 points to the
pInv1(createInvestment()); // object returned from
// createInvestment
std::auto_ptr<Investment> pInv2(pInv1); // pInv2 now points to the
// object; pInv1 is now null
pInv1 = pInv2; // now pInv1 points to the
// object, and pInv2 is null
相對於 auto_ptrs,另一個可選方案是一個引用計數智能指針(reference-counting smart pointer, RCSP)。一個 RCSP 是一個智能指針,它能持續跟蹤有多少對象指向一個特定的資源,並能夠在不再有任何東西指向那個資源的時候刪除它。
總結:
-
爲了防止資源泄漏,使用 RAII 對象,在 RAII 對象的構造函數中獲得資源並在析構函數中釋放它們。
-
兩個通用的 RAII 是 tr1::shared_ptr 和 auto_ptr。tr1::shared_ptr 通常是更好的選擇,因爲它的拷貝時的行爲是符合直覺的。拷貝一個 auto_ptr 是將它置爲空。