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

黎明的剔透里伸出了你沁清的曖昧

Graphics|EngineDev|GameDev|2D&3D Art

  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  60 隨筆 :: 1 文章 :: 18 評(píng)論 :: 0 Trackbacks
C++中new的3種形態(tài):
new operator 
operator new 
placement new


new operator:
new操作符,像 + - * / && . :: ?: 等操作符一樣,是語言內(nèi)置的, 它不能被重載,不能改變其行為。
它的行為包括分配內(nèi)存的 operator new 和調(diào)用構(gòu)造函數(shù)的 placement new。
new operator 實(shí)際上做了三件事:獲得一塊內(nèi)存空間、調(diào)用構(gòu)造函數(shù)、返回正確的指針。如果創(chuàng)建的是簡(jiǎn)單類型(如char)的變量,那么第二步會(huì)被省略。
比如:
CTest* pT = new CTest(22);
它的調(diào)用實(shí)際上等效于:
void*  p  = operator newsizeof(CTest) );//operator new分配內(nèi)存
CTest* pT = new(p) CTest(22);//placement new調(diào)用構(gòu)造函數(shù),并返回正確的CTest*指針


  
operator new:
原型為: void* operator new(size_t size);
它分配指定大小的內(nèi)存, 可以被重載, 可以添加額外的參數(shù), 但第一個(gè)參數(shù)必須為 size_t 。
它除了被 new operator 調(diào)用外也可以直接被調(diào)用, 如: 
void* p = operator new(sizeof(CTest));

這種用法和調(diào)用 malloc 一樣, 只分配了sizeof(CTest)大小的內(nèi)存.



placement new:
置換new,它在一塊已經(jīng)指定的內(nèi)存上調(diào)用構(gòu)造函數(shù), 包含頭文件<new>之后也可以直接使用,
如:
         
CTest* pT = new(p) CTest(22);
它在p這塊內(nèi)存上調(diào)用CTest的構(gòu)造函數(shù)來初始化CTest。
這個(gè)函數(shù)返回一個(gè)對(duì)象指針,對(duì)象是在傳遞進(jìn)來的p這塊內(nèi)存上分配的,也就說指定一個(gè)額外的自變量(p)作為new operator "隱式調(diào)用operator new"時(shí)所用,
于是被調(diào)用的operator new 除了接受"一定得有的size_t"這個(gè)自變量外,還需要接受一個(gè)void *的指針,指向一塊內(nèi)存,準(zhǔn)備用來接受構(gòu)造函數(shù)好的對(duì)象,這樣operator new就
是所謂的placement new,其operator new定義如下:

void * operator new(size_t,void *location){
     
return loaction;
}
所以operator new的目的就是為對(duì)象找到一塊內(nèi)存,然后返回一個(gè)指針指向它.在placement new的情況下,調(diào)用者已經(jīng)知道指向內(nèi)存的指針,因?yàn)檎{(diào)用者知道對(duì)象應(yīng)該放哪,
因此placement new唯一需要做的就是將它獲得的指針再返回,至于沒有用到(但一定得有的)size_t參數(shù),所以不賦予名稱,以免編譯器發(fā)出"某物未被使用"的警告。
如果用 placement new 構(gòu)造出來的對(duì)象,必須顯示的調(diào)用對(duì)象的析構(gòu)函數(shù),
如:     
pT->~CTest();
然后釋放內(nèi)存存, 調(diào)用 operator delete (對(duì)應(yīng)于分配時(shí)的 operator new)operator delete(pT);




 
小結(jié):

1)、想在堆上建立一個(gè)對(duì)象,應(yīng)該用 new 操作符,它既分配內(nèi)存又為對(duì)象調(diào)用構(gòu)
        造函數(shù)。

2)、如果僅僅想分配內(nèi)存,就應(yīng)該調(diào)用 operator new 函數(shù);它不會(huì)調(diào)用構(gòu)造函數(shù)。
    
3)、如果想定制在堆對(duì)象被建立時(shí)的內(nèi)存分配過程,應(yīng)該重載 operator new 函數(shù),
        然后使用 new operator,new operator 會(huì)調(diào)用定制的 operator new 。

4)、如果想在一塊已經(jīng)獲得指針的內(nèi)存里建立一個(gè)對(duì)象,應(yīng)該用 placement new 。 
placement new 主要適用于:
       (a): 對(duì)時(shí)間要求非常高的應(yīng)用程序中,因?yàn)檫@些程序分配的時(shí)間是確定的;
       (b): 長(zhǎng)時(shí)間運(yùn)行而不被打斷的程序;
       (c): 以及執(zhí)行一個(gè)垃圾收集器 (garbage collector) 。

注意:如果用 placement new 構(gòu)造出來的對(duì)象,必須顯示的調(diào)用對(duì)象的析構(gòu)函數(shù)。


程序示例:
 1 #include <iostream>
 2 using namespace std;
 3 #include <new>
 4 
 5 
 6 class CTest{
 7 public:
 8     CTest(int _x, int _y){
 9         X = _x;
10         Y = _y;
11     }
12     ~CTest(){
13         X = 0;
14         Y = 0;
15     }
16     void Test(char* sz){
17         cout<<sz<<":"<<"  "<<"X="<<X<<"   "<<"Y="<<Y<<endl;
18     }
19     int X;
20     int Y;
21 };
22 
23 //new operator:
24 void F1(){
25     CTest* pT = new CTest(11);             // new operator
26     
27     pT->Test("F1");
28 
29     delete pT;
30 
31 }
32 
33 
34 //    operator new
35 //    placement new
36 
37 void F2(){
38     void*  p  = operator new(sizeof(CTest)); // operator new : 分配內(nèi)存
39     CTest* pT = new(p) CTest(22);          // placement new: 構(gòu)造對(duì)象
40     
41     pT->Test("F2");
42     
43     pT->~CTest();                            // 必須顯示析構(gòu)對(duì)象
44     operator delete(pT);                     // operator delete: 釋放內(nèi)存
45 }
46 
47 
48  //   也可這樣實(shí)現(xiàn):
49 void F3(){
50     char*  p  = new char[sizeof(CTest)]; // new operator: char為內(nèi)置類型,不會(huì)調(diào)用構(gòu)造函數(shù),相當(dāng)于只分配內(nèi)存
51 
52     CTest* pT = new(p) CTest(33);      // placement new: 在這塊內(nèi)存上構(gòu)造CTest對(duì)象
53     
54     pT->Test("F3");
55     
56     pT->~CTest();                        // 必須顯示析構(gòu)CTest對(duì)象
57 
58     delete [] p;                         // delete operator: char為內(nèi)置類型,不會(huì)調(diào)用析構(gòu)函數(shù),相當(dāng)于只釋放內(nèi)存
59 }
60 
61 
62 void main(){
63     F1();
64     F2();
65     F3();
66 } 
F1:  X=1   Y=1
F2:  X=2   Y=2
F3:  X=3   Y=3
Press any key to continue


 
C++中的delete:
為了避免resource leaks,每一個(gè)動(dòng)態(tài)分配行為都應(yīng)該必須匹配一個(gè)相應(yīng)但相反的釋放動(dòng)作;
如果你寫:
string *ps;
delete ps;//使用delete operator;相對(duì)與 new operator
指向delete ps;要求編譯器既能夠析構(gòu)ps所指的對(duì)象,又能夠釋放被該對(duì)象占用的內(nèi)存,
其中釋放內(nèi)存是由operator delete所執(zhí)行的(相對(duì)于 operator new),其聲明如下:

void operator delete(void *memoryTOBeDeallocated);

因此執(zhí)行delete ps; 那么編譯器就產(chǎn)生了如下代碼:
ps->~string();               //調(diào)用對(duì)象的析構(gòu)函數(shù)dtoroperator
operator delete(ps);       //釋放對(duì)象所占的內(nèi)存

這里呈現(xiàn)的一個(gè)暗示就是:若果你打算處理原始的、未設(shè)置初值的內(nèi)存,應(yīng)該完全回避new operator和delete operator ,改調(diào)用operator new 取得內(nèi)存,operator delete歸還系統(tǒng)內(nèi)存
void *buffer=operator new(50*sizeif(char)); // 分配內(nèi)存相當(dāng)于C語言中的malloc

operator delete(buffer);       //釋放內(nèi)存 但沒用調(diào)用任何析構(gòu)函數(shù) 相當(dāng)于C語言中的free

如果你使用了placement new在某塊內(nèi)存上產(chǎn)生對(duì)象,你應(yīng)該避免對(duì)那塊內(nèi)存使用delete operator,這是因?yàn)閐elete operator會(huì)調(diào)用operator delete來釋放內(nèi)存,但是該內(nèi)存內(nèi)含的對(duì)象最初并非是由operator new分配的,畢竟placement new只返回它所接受的指針而已,但不知道這個(gè)指針是從哪里來的,所以為了抵消該對(duì)象的構(gòu)造函數(shù)的影響,你應(yīng)該直接調(diào)用該對(duì)象的析構(gòu)函數(shù)

class Widget{
public:
    Widget(
int WidgetSize);
    
};

Widget
* constructWidgetInBUuffer(void *buffer,int WidgetSize){
        
return new(buffer) Widget(WidgetSize);
}
//以下函數(shù)用來分配及釋放shared memory中的內(nèi)存
void *mallocShared(size_t size);
void freeShared(void *memory);

void *sharedMemory=mallocShared(sizeof(Widget));

Widget 
*pw=constructWidgetInBUuffer(sharedMemory,10);//運(yùn)用placement new

delete pw;
//無定義!!,因?yàn)閟haredMemory來自mallocShared,不是來自operator new

pw
->~Widget();//OK!!析構(gòu)pw所指的Widget對(duì)象,但未釋放Widget對(duì)象的內(nèi)存

freeShared(pw);
//OK!!  釋放pw所指的內(nèi)存 不用調(diào)用任何析構(gòu)函數(shù)








posted on 2011-10-30 00:22 情絕格調(diào)(fresmaster) 閱讀(447) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Coding
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲午夜一级| 欧美午夜剧场| 一区二区激情视频| 亚洲片在线观看| 亚洲二区在线| 亚洲国产欧美不卡在线观看| 欧美激情亚洲国产| 91久久香蕉国产日韩欧美9色| 欧美成人免费网| 欧美激情综合色综合啪啪 | 一区在线免费观看| 亚洲国产精品久久久久婷婷884| 亚洲国产精品一区二区第四页av| 激情成人av| 一本色道久久综合亚洲二区三区 | 久久精品视频在线| 欧美刺激午夜性久久久久久久| 欧美交受高潮1| 久久午夜精品| 国产综合在线看| 亚洲国产精品嫩草影院| 亚洲精品日韩综合观看成人91| 中日韩高清电影网| 久久一区二区视频| 99精品国产在热久久婷婷| 小处雏高清一区二区三区 | 欧美国产亚洲精品久久久8v| 亚洲乱码国产乱码精品精可以看| 欧美亚洲尤物久久| 欧美日韩a区| 亚洲国产精品ⅴa在线观看| 亚洲小说春色综合另类电影| 免费久久99精品国产| 一区二区三区 在线观看视频| 久久久久国产精品一区二区| 国产精品久久一区二区三区| 亚洲三级影院| 麻豆av一区二区三区| 亚洲一区一卡| 欧美新色视频| 一区二区三区国产精华| 欧美激情精品| 久久久综合精品| 国产一区二区三区在线免费观看 | 激情国产一区| 先锋影音国产精品| 在线视频日韩| 欧美日韩中文字幕在线| 亚洲黄色av一区| 欧美+亚洲+精品+三区| 性欧美1819sex性高清| 欧美性色综合| 亚洲一区二区三区在线看| 亚洲精品裸体| 欧美日产在线观看| 一区二区激情视频| 日韩亚洲一区在线播放| 欧美日韩一区二区精品| 一区二区三区免费看| 亚洲精品国产精品久久清纯直播 | 欧美日韩一区二区三区| 99在线热播精品免费| 亚洲国产精品第一区二区三区| 欧美精品色综合| 免费久久99精品国产自在现线| 国内外成人免费激情在线视频| 久久精品夜色噜噜亚洲a∨| 亚洲资源在线观看| 国产日韩欧美三区| 久久亚洲私人国产精品va| 久久久久久网| 亚洲国产成人在线播放| 亚洲国产高清aⅴ视频| 欧美国产亚洲精品久久久8v| 日韩一区二区免费看| 亚洲九九精品| 国产精品一区在线观看你懂的| 欧美一级免费视频| 久久黄金**| 日韩网站在线| 亚洲一区二区三区精品视频| 国产一区二区欧美| 欧美激情一区在线| 国产精品久久久久久久久久直播 | 亚洲精品在线视频观看| 亚洲青色在线| 国产精品亚洲аv天堂网| 久久精品亚洲乱码伦伦中文| 久久久蜜桃精品| 中日韩午夜理伦电影免费| 亚洲欧美怡红院| 亚洲人成在线观看一区二区| 一区二区av在线| 在线观看视频一区二区欧美日韩| 亚洲激情精品| 国内自拍一区| 宅男精品视频| 亚洲激情午夜| 欧美亚洲在线视频| 99精品视频免费在线观看| 午夜精品久久久久久久久| 亚洲七七久久综合桃花剧情介绍| 中国成人亚色综合网站| 亚洲国产精品t66y| 欧美一级欧美一级在线播放| 99国内精品| 理论片一区二区在线| 久久成人免费网| 欧美日韩精品久久| 欧美激情第3页| 精品99一区二区| 亚洲欧美精品一区| 一本高清dvd不卡在线观看| 久久精品亚洲热| 久久超碰97人人做人人爱| 欧美日韩一区二区免费视频| 亚洲国产精品va| 精品不卡在线| 欧美在线免费观看视频| 亚洲欧美在线x视频| 欧美精品色一区二区三区| 欧美r片在线| 在线精品高清中文字幕| 午夜精品在线看| 欧美一区二区视频在线观看| 正在播放亚洲| 亚洲美女免费视频| 久热精品视频在线观看| 久久影院午夜论| 精品99一区二区| 久久理论片午夜琪琪电影网| 欧美亚洲一区| 国产日韩欧美在线看| 亚洲婷婷综合色高清在线| 宅男噜噜噜66一区二区| 欧美mv日韩mv国产网站| 亚洲电影免费观看高清完整版| 在线精品视频一区二区| 久久亚洲国产精品一区二区 | 一区二区亚洲欧洲国产日韩| 亚洲欧美日韩久久精品| 欧美永久精品| 国产亚洲一区在线播放| 午夜精品偷拍| 久久久中精品2020中文| 精品999久久久| 欧美a级片网站| 最新日韩在线视频| 日韩亚洲欧美成人一区| 欧美精品一区二区视频| 99精品国产在热久久| 亚洲欧美偷拍卡通变态| 国产日韩综合一区二区性色av| 欧美一区二区三区日韩视频| 牛牛影视久久网| 99riav1国产精品视频| 国产精品另类一区| 久久精品1区| 91久久综合| 先锋影音国产一区| 亚洲电影免费观看高清完整版| 欧美国产激情| 亚洲私人黄色宅男| 久久理论片午夜琪琪电影网| 最新热久久免费视频| 欧美先锋影音| 久久久www成人免费毛片麻豆| 亚洲国产日韩欧美在线图片 | 亚洲人成人一区二区在线观看| 欧美区高清在线| 午夜精品电影| 亚洲国产精品123| 亚洲欧美日韩国产成人精品影院| 国内成+人亚洲+欧美+综合在线| 美女诱惑一区| 亚洲女性喷水在线观看一区| 欧美国产第一页| 久久av一区二区三区亚洲| 亚洲日本欧美日韩高观看| 国产精品视频久久一区| 欧美gay视频激情| 欧美一区二区黄色| 99国产精品视频免费观看| 老牛嫩草一区二区三区日本| 亚洲图中文字幕| 亚洲黄色影片| 国产性做久久久久久| 欧美特黄a级高清免费大片a级| 久久夜色精品国产欧美乱| 亚洲欧美日韩一区二区在线 | 牛夜精品久久久久久久99黑人 | 亚洲欧美在线一区二区| 91久久精品美女高潮| 国产丝袜美腿一区二区三区| 欧美日本成人| 欧美韩国在线| 欧美成人亚洲成人日韩成人| 久久国产精品毛片| 亚洲一区欧美| 这里只有精品视频|