定位放置new

一般來說,使用new申請空間時,是從系統的“堆”(heap)中分配空間。申請所得的空間的位置時根據當時的記憶體的實際使用情況決定的。但是,在某些特殊情況下,可能需要在程式設計師指定的特定記憶體創建對象,這就是所謂的“定位放置new”(placement new)操作。

基本介紹

  • 中文名:定位放置new
  • 外文名:placement new
  • 學科:計算機
  • 領域:C++編程
定位放置new操作的語法形式不同於普通的new操作。例如,一般都用如下語句A* p=new A;申請空間,而定位放置new操作則使用如下語句A* p=new (ptr) A;申請空間,其中ptr就是程式設計師指定的記憶體首地址。考察如下程式。
#include <iostream>using namespace std; class A{    int num;public:    A(){        cout<<"A's constructor"<<endl;    }     ~A(){        cout<<"~A"<<endl;    }    void show(){        cout<<"num:"<<num<<endl;    }}; int main(){    char mem[100];    mem[0]='A';    mem[1]='\0';    mem[2]='\0';    mem[3]='\0';    cout<<(void*)mem<<endl;    A* p=new (mem) A;    cout<<p<<endl;    p->show();    p->~A();    getchar();}
程式運行結果:
0024F924
A's constructor
0024F924
num:65
~A
閱讀以上程式,注意以下幾點。
(1)用定位放置new操作,既可以在棧(stack)上生成對象,也可以在堆(heap)上生成對象。如本例就是在棧上生成一個對象。
(2)使用語句A* p=new (mem) A;定位生成對象時,指針p和數組名mem指向同一片存儲區。所以,與其說定位放置new操作是申請空間,還不如說是利用已經請好的空間,真正的申請空間的工作是在此之前完成的。
(3)使用語句A *p=new (mem) A;定位生成對象是,會自動調用類A的構造函式,但是由於對象的空間不會自動釋放(對象實際上是借用別人的空間),所以必須顯示的調用類的析構函式,如本例中的p->~A()。
(4)萬不得已才使用placement new,只有當你真的在意對象在記憶體中的特定位置時才使用它。例如,你的硬體有一個記憶體映像的I/O記時器設備,並且你想放置一個Clock對象在哪那個位置。

相關詞條

熱門詞條

聯絡我們