国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
C++使用對(duì)象來(lái)管理動(dòng)態(tài)分配資源

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ù).

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
動(dòng)態(tài)內(nèi)存
c++動(dòng)態(tài)內(nèi)存分配
delete與delete [] 真正區(qū)別
C/C++拾遺(七):利用對(duì)象管理資源
C 智能指針如何實(shí)現(xiàn)智能?
虎牙技術(shù)面 C ,問(wèn)得真細(xì)節(jié)。。
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服