from http://blog.csdn.net/stevenliyong/article/details/3728204
2009.01
C++使用對(duì)象來(lái)管理動(dòng)態(tài)分配資源
1. 引入
void f()
{
Investment *pInv = createInvestment(); // call factory function
... // use pInv
delete pInv; // release object
}
代碼本身沒(méi)有問(wèn)題,但這個(gè)存在隱患,程序員必須很小心的處理delete 才不至于出現(xiàn)內(nèi)存泄露.
因?yàn)橛锌赡茉谶@個(gè)函數(shù)的 "..." 部分的某處有一個(gè)提前出現(xiàn)的 return 語(yǔ)句。
萬(wàn)一這樣一個(gè) return 被執(zhí)行,就內(nèi)存泄露了。
為了確保 createInvestment 返回的資源總能被釋放,
我們可以將createInvestment 指針?lè)湃胍粋€(gè)資源管理對(duì)象的實(shí)例中,
利用這個(gè)對(duì)象的析構(gòu)函數(shù)來(lái)釋放資源。
由于這個(gè)對(duì)象是存在棧上的,因此f()函數(shù)返回的時(shí)候
必然會(huì)調(diào)用對(duì)象析構(gòu)函數(shù)來(lái)自動(dòng)釋放資源.
2. 使用auto_ptr對(duì)象
void f()
{
std::auto_ptr<Investment> pInv(createInvestment()); // call factory
// function
... // use pInv as
// before
}
但是存在問(wèn)題,auto_ptr 只允許一個(gè)auto_prt對(duì)象指向Investment資源
因此拷貝構(gòu)造函數(shù)和賦值操作都會(huì)使原來(lái)的指針為空
std::auto_ptr<Investment> pInv2(pInv1); //pInv1 will be null !!!
pInv2 = pInv1; //pInv1 wiil be null !!!
正因?yàn)槿绱?auto_ptrs 的STL容器是不被允許的。
3.使用TR1的shared_ptr對(duì)象
tr1::shared_ptr能持續(xù)跟蹤有多少 objects(對(duì)象)指向一個(gè)特定的資源,
并能夠在不再有任何東西指向那個(gè)資源的時(shí)候自動(dòng)刪除它的 smart pointer(智能指針)。
std::tr1::shared_ptr<Investment> // pInv1 points to the
pInv1(createInvestment()); // object returned from
// createInvestment
std::tr1::shared_ptr<Investment> // both
pInv1 and pInv2 now
pInv2(pInv1); // point to the object
pInv1 = pInv2; // ditto — nothing has
// changed
tr1::shared_ptrs 能被用于 STL容器以及其它和 auto_ptr 的非正統(tǒng)的拷貝行為不相容的環(huán)境中。
3. 動(dòng)態(tài)分配數(shù)組問(wèn)題
但碰到動(dòng)態(tài)分配數(shù)組的時(shí)候前述的兩者都不是好主意
std::auto_ptr<std::string> // bad idea! the wrong
aps(new std::string[10]); // delete form will be used
std::tr1::shared_ptr<int> spi(new int[1024]); // same problem
這樣的使用會(huì)導(dǎo)致auto_ptr或tr1::shared_ptr只刪除一個(gè)string和int對(duì)象,而不是對(duì)象的數(shù)組引起內(nèi)存泄露
(auto_ptr 或 tr1::shared_ptr 根本無(wú)法判斷它指向的資源是一個(gè)單一的對(duì)象還是一個(gè)對(duì)象數(shù)組).
C++ 甚至在 TR1 都沒(méi)有可用于動(dòng)態(tài)分配數(shù)組的類(lèi)似auto_ptr或tr1::shared_ptr這樣的東西。
那是因?yàn)?vector幾乎總是能代替動(dòng)態(tài)分配數(shù)組!!! 汗.以后寫(xiě)C++代碼的時(shí)候注意盡量用vector代替數(shù)組.
如果非要對(duì)動(dòng)態(tài)分配數(shù)組資源使用對(duì)象管理,可以用boost庫(kù)中的 boost::scoped_array 和 boost::shared_array 函數(shù).
聯(lián)系客服