青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

?new/delete究竟做了些什么
???
在理解這個問題之前,我們先看一下下面的這段程序,有這么一個程序段:
?????? class A
?????? {
?????? public:
?????????? A() {?? cout<<"A is here!"<<endl;?? }
?????????? ~A(){?? cout<<"A is dead!"<<endl;?? }
?????? private:
?????????? int i;
?????? };
?????? A* pA=new A;
?????? delete pA;
??? 在這個簡單的程序段里面,new/delete究竟做了些什么?
??? 實際上,這段程序里面隱含調用了一些我們沒有看到的東西,那就是:
??? static void* operator new(size_t sz);
??? static void? operator delete(void* p);
??? 值得注意的是,這兩個函數都是static的,所以如果我們重載了這2個函數(我們要么不重載,要重載就要2個一起行動),也應該聲明為static的,如果我們沒有聲明,系統也會為我們自動加上。另外,這是兩個內存分配原語,要么成功,要么沒有分配任何內存。
??? size_t是什么東西呢?我在第一次看到這個動動的時候也是十分的困惑,畢竟以前沒有見過。size_t在<cstddef>中定義,是一種無符號整數類型(不一定是int),用來保存對象的大小,這一用法是從C語言中借用過來的,現在你應該明白了吧(我學習的時候可是郁悶了好幾天,沒有人可以問,因為不知道有個csdn:)
??? new A;實際上做了2件事:調用opeator new,在自由存儲區分配一個sizeof(A)大小的內存空間;然后調用構造函數A(),在這塊內存空間上類磚砌瓦,建造起我們的對象。同樣對于delete,則做了相反的兩件事:調用析構函數~A(),銷毀對象,調用operator delete,釋放內存。不過需要注意的是,new分配一塊內存的時候,并沒有對這塊內存空間做清零等任何動作,只是拿了過來,這塊內存上放的仍然是原來的數據(垃圾數據),delete的時候,也只是釋放這塊內存,歸還給操作系統,上面的數據還在上面,所以delete pA之后,pA的值沒變,他指向的那塊內存的值也沒有變,不過似乎有什么問題,我們看一下下面的這個程序段:
?int *p=new int(50000);
?cout<<*p<<"?? "<<p<<endl;
?delete p;
?cout<<*p<<"?? "<<p<<endl;
??? 我們可以清楚地看到,指針p存放的數據仍然是原來的地址,但是*p的內容卻發生了變化,在我的機器上(win2000, VC6)始終是-572662307,不清楚這是為什么,難道系統做了什么手腳?還望高手指教。??
??? 在這里我們可以看到,new的工作實際上就是保證相互分離的存儲分配和初始化工作能夠很好的在一起工作,不過這里可能讓初學者迷惑的是,我們定義了一個帶有參數的new,但是我們用的時候卻沒有顯式的去調用,而是讓系統“神秘”的去提供這個參數。是的,這樣做毫無疑問增加了復雜性,但是讓基類獲取了為一集派生類提供分配和釋放服務的能力。??

??? new/delete有什么好處和壞處
??? 從C程序員轉換過來的C++程序員總是有個困惑:new/delete到底究竟和C語言里面的malloc/free比起來有什么優勢?或者是一樣的?
??? 其實,就算我不說,你也應該很清楚了,new/delete當然比malloc/free要好,要不然,為什么還引進這個東東呢?其實通過上面的分析,我們看到了new/delete實際上做了很多malloc/free沒有做的事情:malloc/free只是對內存進行分配和釋放;new/delete還負責完成了創建和銷毀對象的任務。
??? 另外,new的安全性要高一些,因為他返回的就是一個所創建的對象的指針,對于malloc來說返回的則是void*,還要進行強制類型轉換,顯然這是一個危險的漏洞。
??? 最后,我們可以對new/delete重載,使內存分配按照我們的意愿進行,這樣更具有靈活性,malloc則不行。
??? 不過,new/delete也并不是十分完美,大概最大的缺點就是效率低(針對的是缺省的分配器),原因不只是因為在自由存儲區上分配(和棧上對比),具體的原因目前不是很清楚,不過在MCD上說了2個可能的原因:
??? 1、new只是對于堆分配器(malloc/realloc/free)的一個淺層包裝,沒有針對小型的內存分配做優化。
??? 2、缺省分配器具有通用性,它管理的是一塊內存池,這樣的管理往往需要消耗一些額外空間。

??? 各種各樣的new
??? 一般來說,new有很多種形式,不過真的歸納起來,也就是2種:
??? 1、最常用的形式:
?????? void *operator new(std::size_t sz)??? throw(std::bad_alloc);?? (普通的)
?????? void *operator new[](std::size_t sz)? throw(std::bad_alloc);??? (數組的)
?????? void *operator new(std::size_t sz);
?????? void *operator new[](std::size_t sz)
??? 這一種大家用得最為頻繁,我就不舉例子了。
??? 2、放置new形式:
?????? void *operator new(std::size_t count, void *ptr)?? throw();??? (普通的)
?????? void *operator new[](std::size_t count, void *ptr) throw();???? (數組的)
????要使用這種方式,必須包含頭文件<new>。這個機制引入的初始目的是為了解決2個相關的問題:
?????? 1、把一個對象放在某個特定位置;
?????? 2、在某個特定分配區里面分配對象;
?????? 但是引入之后,發現這種機制遠超出了簡單的存儲分配機制,我們可以給特定的存儲位置關聯任意的邏輯性值,這樣一來,new就有了一種通用資源管理器的作用。同時第二個參數,也被擴展成了任意的可以識別的類型,并且配備了相應的nothrow版本:
?????? void* operator new(std::size_t, const std::nothrow_t&)?? throw();
?????? void* operator new[](std::size_t, const std::nothrow_t&) throw();

??? new能夠返回NULL么?
??? 我們經常看到有很多初學者喜歡寫如下代碼:
??? A* p=new A();
??? if(p==NUL) ....
??? 寫下這段代碼的可能是受到了一些書上錯誤的影響,因為new A()從來就不可能返回NULL,如果在這個過程中用完了內存,那么他就會拋出bad_alloc異常,絕對不會返回NULL,如果你想讓他返回null,應該用new(nothrow) A(),而不是new A()。不過從異常的觀點來看,這實際上是一種倒退,我們應該盡量回避。


Posted on 2006-11-21 17:05 艾凡赫 閱讀(241) 評論(0)  編輯 收藏 引用 所屬分類: C++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美激情久久久| 亚洲天堂久久| 欧美一区永久视频免费观看| 久久综合亚州| 久久久精品免费视频| 日韩一级黄色片| 亚洲黄色在线| 亚洲欧洲三级| 亚洲夫妻自拍| 亚洲精品永久免费| 亚洲福利视频网站| 亚洲福利视频一区二区| 亚洲欧洲综合| 亚洲视频第一页| 在线一区视频| 欧美在线免费观看| 欧美1区2区3区| 免费成人高清在线视频| 欧美成人dvd在线视频| 欧美区国产区| 国产精品综合视频| 亚洲国产日韩精品| 亚洲图片欧美一区| 校园春色综合网| 美日韩丰满少妇在线观看| 欧美电影免费观看| 亚洲亚洲精品三区日韩精品在线视频| 日韩午夜在线观看视频| 亚洲国产另类久久久精品极度| 国产日本欧美在线观看| 免费国产自线拍一欧美视频| 亚洲一二三级电影| 久久成人亚洲| 99天天综合性| 玖玖综合伊人| 国产一区二区三区久久悠悠色av | 亚洲高清精品中出| 亚洲欧美在线高清| 91久久综合| 久久国内精品视频| 国产亚洲激情在线| 亚洲欧美在线aaa| 在线一区二区日韩| 欧美日韩精品一区| 欧美影院在线播放| 国产精品igao视频网网址不卡日韩 | 国产精品久久久久久影视 | 伊人久久大香线蕉av超碰演员| 亚洲小视频在线| 亚洲最新在线| 欧美视频一区二区三区…| 日韩天堂在线视频| 亚洲精品乱码久久久久久日本蜜臀| 久久综合久色欧美综合狠狠| 亚洲国产成人在线播放| 亚洲第一成人在线| 国产精品亚洲综合一区在线观看 | 国产精品青草久久| 午夜在线一区二区| 欧美在线二区| 亚洲激情综合| 亚洲一区三区电影在线观看| 国产午夜亚洲精品理论片色戒| 玖玖综合伊人| 国产精品久久久久av免费| 久久精品国产一区二区三区免费看| 久久久久久亚洲精品中文字幕| 亚洲精品国产精品乱码不99| 一区二区三区高清不卡| 国产一区二区三区四区hd| 亚洲风情亚aⅴ在线发布| 国产精品久久久久毛片软件| 免费在线成人av| 亚洲香蕉伊综合在人在线视看| 国产精品看片你懂得| 欧美激情一区二区久久久| 国产精品一卡二卡| 亚洲一区二区精品视频| 一区二区三区日韩欧美精品| 欧美成熟视频| 99国产精品私拍| 亚洲综合第一| 国产精品入口麻豆原神| 亚洲影院色无极综合| 欧美亚洲三级| 国内精品久久久久伊人av| 午夜电影亚洲| 美女图片一区二区| 亚洲国产成人在线播放| 欧美成人在线免费观看| 亚洲高清精品中出| 一本大道av伊人久久综合| 欧美精品18+| 午夜精品久久久久久久男人的天堂| 欧美一区国产二区| 亚洲国产精品免费| 欧美日韩中文字幕在线视频| 亚洲婷婷综合久久一本伊一区| 欧美一区二区三区视频在线| 国产综合久久久久久| 欧美日韩国产综合新一区| 亚洲一区二区日本| 欧美激情一区二区三区在线视频| 国产欧美日韩一区二区三区| 久久久久久久综合狠狠综合| 亚洲经典在线| 久久性天堂网| 亚洲一区二区三区成人在线视频精品| 国产亚洲综合精品| 亚洲电影自拍| 久久婷婷激情| 影音先锋欧美精品| 欧美人与性动交α欧美精品济南到| 亚洲专区一二三| 一区二区三区www| 亚洲精品欧美在线| 免费日韩一区二区| 美女啪啪无遮挡免费久久网站| 午夜天堂精品久久久久| 亚洲一级高清| 亚洲欧美精品在线观看| 亚洲综合精品自拍| 欧美亚洲一区二区三区| 亚洲一级二级| 亚洲免费在线| 欧美在线视频二区| 久久亚洲欧洲| 欧美成人精品一区二区三区| 另类图片国产| 亚洲韩国精品一区| 日韩视频在线一区二区三区| 日韩午夜精品| 欧美亚洲专区| 美女免费视频一区| 欧美日韩免费一区二区三区视频| 欧美日韩www| 国内精品美女av在线播放| 亚洲国产精品黑人久久久| 制服丝袜激情欧洲亚洲| 欧美一级片一区| 蜜臀av性久久久久蜜臀aⅴ| 欧美在线一区二区三区| 久久激情五月激情| 亚洲精品男同| 欧美一二三视频| 欧美精品偷拍| 激情欧美丁香| 欧美一级淫片aaaaaaa视频| 亚洲国产精品电影| 久久免费99精品久久久久久| 欧美日韩福利| 亚洲国产小视频| 狂野欧美一区| 亚洲一级在线| 野花国产精品入口| 欧美片在线播放| 日韩视频免费在线观看| 免费在线看成人av| 久久久久.com| 亚洲人成人99网站| 亚洲国产欧美日韩精品| 久久久久国产精品www| 韩国亚洲精品| 欧美黄色成人网| 欧美精品久久久久久| 亚洲精品一区二| 一本久久综合| 国产酒店精品激情| 老巨人导航500精品| 免费看亚洲片| 午夜精品视频| 久久精品欧美日韩| 亚洲国产精品va在看黑人| 欧美国产精品中文字幕| 欧美电影打屁股sp| 亚洲免费一在线| 久久久www| 一区二区欧美在线观看| 欧美有码视频| 一区二区动漫| 久久国产夜色精品鲁鲁99| 亚洲理伦在线| 性欧美长视频| 亚洲自啪免费| 欧美精品免费看| 卡一卡二国产精品| 国产精品日韩一区| 亚洲精品乱码久久久久久蜜桃麻豆| 国产免费成人av| 99国产一区| 一本色道**综合亚洲精品蜜桃冫 | 亚洲欧洲精品一区二区| 国产精品电影网站| 亚洲日本在线观看| 免费看精品久久片| 亚洲欧美日韩在线综合| 欧美激情中文字幕在线| 欧美激情国产日韩精品一区18| 极品中文字幕一区| 久久亚洲精品网站|