new operator, operator new, placement new

本文參考地址 http://www.cnblogs.com/luxiaoxun/archive/2012/08/10/2631812.html

new operator

就是new 操作符:

  • 調(diào)用 operator new 分配足夠的內(nèi)存空間,調(diào)用對象的構(gòu)造函數(shù)
  • 不能被重載
operator new

是函數(shù):

  • 只分配內(nèi)存拦键,不調(diào)用構(gòu)造函數(shù)
  • 可以被重載
  • 重載時花盐,返回值類型必須聲明為void *
  • 重載時,第一個參數(shù)必須是要求分配空間的字節(jié)大小,類型是 size_t
  • 重載時,允許攜帶其他參數(shù)呢蔫。

例子:

#include <iostream>
#include <string>
using namespace std;

class X{
public:
  X(){
    cout<<"constructor"<<endl;
  }
  
  void* operator new(size_t size, string str){
    cout<< "operator new " << size <<  "  " <<  str << endl;
    return ::operator new(size);
  }   
  void operator delete(void* pointer){
     cout << "operator delete" <<endl;
     ::operator delete(pointer);
  }

  ~X(){
    cout<<"destructor"<<endl;
  }
};

int main(){
  X *x = new ("str") X;
  delete x;
  return 1;
}
placement new

placement new 是重載operator new 的一個標(biāo)準(zhǔn)、全局的版本洞辣,它不能夠被自定義的版本代替(不像普通版本的operator new和operator delete能夠被替換)咐刨。原型為:

void *operator new( size_t, void * p ) throw() { return p; }

placement new 的執(zhí)行忽略了size_t參數(shù)昙衅,只返還第二個參數(shù)扬霜。其結(jié)果是允許用戶把一個對象放到一個特定的地方,達(dá)到調(diào)用構(gòu)造函數(shù)的效果而涉。和其他普通的new不同的是著瓶,它在括號里多了另外一個參數(shù)。

palcement new 存在理由

  • 空間啼县。不分配新的內(nèi)存材原,而是構(gòu)造一個新對象到預(yù)分配的內(nèi)存上沸久。
  • 時間。new 操作符分配內(nèi)存余蟹,需要在堆上查詢足夠大的內(nèi)存空間卷胯,而且會存在不能分配的異常(內(nèi)存不足);placement new 是在已有的內(nèi)存上構(gòu)造對象威酒,不查找內(nèi)存窑睁,分配內(nèi)存的時間復(fù)雜度為常數(shù),且不存在內(nèi)存分配異常的情況葵孤。適合時間要求高和長時間允許不被打斷的程序担钮。

placement 使用需要五步

  • 緩存提前分配,有三種方式:

  • 在堆上進行分配class Task :
    char * buff = new [sizeof(Task)];

  • 在棧上進行分配class Task:
    char buf[N*sizeof(Task)];

  • 還有一種方式,就是直接通過地址來使用尤仍。(必須是有意義的地址)

void* buf = reinterpret_cast<void*> (0xF00F);
  • 第二步:對象的分配
    剛才已分配的緩存區(qū)調(diào)用placement new來構(gòu)造一個對象:
Task *ptask = new (buf) Task
  • 第三步:使用
    按照普通方式使用分配的對象:
ptask->memberfunction();
ptask->member;
  • 第四步:對象的析構(gòu)
    一旦你使用完這個對象箫津,你必須調(diào)用它的析構(gòu)函數(shù)來毀滅它。
ptask->~Task(); //調(diào)用外在的析構(gòu)函數(shù)

第五步:釋放
你可以反復(fù)利用緩存并給它分配一個新的對象(重復(fù)步驟2宰啦,3苏遥,4)如果你不打算再次使用這個緩存,你可以象這樣釋放它:

delete [] buf;

跳過任何步驟就可能導(dǎo)致運行時間的崩潰赡模,內(nèi)存泄露暖眼,以及其它的意想不到的情況。如果你確實需要使用placement new,請認(rèn)真遵循以上的步驟诅病。

#include <iostream>
using namespace std;

class X
{
public:
    X() { cout<<"constructor of X"<<endl; }
    ~X() { cout<<"destructor of X"<<endl;}

    void SetNum(int n)
    {
        num = n;
    }

    int GetNum()
    {
        return num;
    }

private:
    int num;
};

int main()
{
    char* buf = new char[sizeof(X)];
    X *px = new(buf) X;
    px->SetNum(10);
    cout<<px->GetNum()<<endl;
    px->~X();
    delete []buf;

    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泄私,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子栋豫,更是在濱河造成了極大的恐慌,老刑警劉巖谚殊,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丧鸯,死亡現(xiàn)場離奇詭異,居然都是意外死亡嫩絮,警方通過查閱死者的電腦和手機丛肢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剿干,“玉大人蜂怎,你說我怎么就攤上這事≈枚” “怎么了杠步?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我幽歼,道長朵锣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任甸私,我火速辦了婚禮诚些,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘皇型。我一直安慰自己泣刹,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布犀被。 她就那樣靜靜地躺著椅您,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寡键。 梳的紋絲不亂的頭發(fā)上掀泳,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音西轩,去河邊找鬼员舵。 笑死,一個胖子當(dāng)著我的面吹牛藕畔,可吹牛的內(nèi)容都是我干的马僻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼注服,長吁一口氣:“原來是場噩夢啊……” “哼韭邓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起溶弟,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤女淑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辜御,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸭你,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年擒权,在試婚紗的時候發(fā)現(xiàn)自己被綠了袱巨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡碳抄,死狀恐怖愉老,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纳鼎,我是刑警寧澤俺夕,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布裳凸,位于F島的核電站贱鄙,受9級特大地震影響劝贸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逗宁,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一映九、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瞎颗,春花似錦件甥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至倦逐,卻和暖如春譬正,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背檬姥。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工曾我, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人健民。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓抒巢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親秉犹。 傳聞我的和親對象是個殘疾皇子蛉谜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容