C++中的定位放置new(placement new)
轉載:https://www.cnblogs.com/weekbo/p/8533368.html
今天在使用new時,需要使用特定位置的一塊內存,因此查了資料,發現該文章有幫助就現轉載做一個備份。
一般來說,使用new申請空間時,是從系統的“堆”(heap)中分配空間。申請所得的空間的位置時根據當時的內存的實際使用情況決定的。但是,在某些特殊情況下,可能需要在程序員指定的特定內存創建對象,這就是所謂的“定位放置new”(placement new)操作。
定位放置new操作的語法形式不同于普通的new操作。例如,一般都用如下語句A* p=new A;申請空間,而定位放置new操作則使用如下語句A* p=new (ptr) A;申請空間,其中ptr就是程序員指定的內存首地址??疾烊缦鲁绦?。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #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對象在哪那個位置。
總結
以上是生活随笔為你收集整理的C++中的定位放置new(placement new)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国密SM2非对称加密算法(对本地文件的加
- 下一篇: MySQL字符串拼接、分组拼接字符串