日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++中的定位放置new(placement new)

發(fā)布時間:2023/12/20 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++中的定位放置new(placement new) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載:https://www.cnblogs.com/weekbo/p/8533368.html

今天在使用new時,需要使用特定位置的一塊內(nèi)存,因此查了資料,發(fā)現(xiàn)該文章有幫助就現(xiàn)轉(zhuǎn)載做一個備份。

一般來說,使用new申請空間時,是從系統(tǒng)的“堆”(heap)中分配空間。申請所得的空間的位置時根據(jù)當時的內(nèi)存的實際使用情況決定的。但是,在某些特殊情況下,可能需要在程序員指定的特定內(nèi)存創(chuàng)建對象,這就是所謂的“定位放置new”(placement new)操作。

定位放置new操作的語法形式不同于普通的new操作。例如,一般都用如下語句A* p=new A;申請空間,而定位放置new操作則使用如下語句A* p=new (ptr) A;申請空間,其中ptr就是程序員指定的內(nèi)存首地址。考察如下程序。

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和數(shù)組名mem指向同一片存儲區(qū)。所以,與其說定位放置new操作是申請空間,還不如說是利用已經(jīng)請好的空間,真正的申請空間的工作是在此之前完成的。

(3)使用語句A *p=new (mem) A;定位生成對象是,會自動調(diào)用類A的構造函數(shù),但是由于對象的空間不會自動釋放(對象實際上是借用別人的空間),所以必須顯示的調(diào)用類的析構函數(shù),如本例中的p->~A()。

(4)萬不得已才使用placement new,只有當你真的在意對象在內(nèi)存中的特定位置時才使用它。例如,你的硬件有一個內(nèi)存映像的I/O記時器設備,并且你想放置一個Clock對象在哪那個位置。

總結

以上是生活随笔為你收集整理的C++中的定位放置new(placement new)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。