色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > C++中placement new和delete討論

C++中placement new和delete討論 時間:2018-09-27      來源:未知

在程序設計中頻繁地進行動態內存分配和釋放容易造成內存碎片,給需要長期穩定運行的系統帶來了隱患。盡管現代操作系統在內存管理的穩健性上已經有了較大提高,但是動態內存分配的效率、穩定性等問題仍然是一個困擾。所以在需要長期穩定運行的、生命攸關的嵌入式設備程序開發中通常都要避免過多地使用new和delete,甚至禁止使用C++的標準庫,因為其中經常進行動態內存的分配與釋放。然而要充分享用使用C++帶來的便利之處,動態地創建和銷毀對象的能力還是非常有必要的。

本文引用地址://www.einuk.cn/emb/Column/7365.html

通常的new運算符會在堆中動態分配內存,并在成功分配的內存空間上調用相應對象的構造函數,而delete運算符會先在該內存空間上調用相應對象的析構函數,然后釋放該內存空間。然而在C++中,可以通過對new和delete的重載來實現特殊的功能。不過在程序員編寫的new和delete的重載函數中都只是負責內存空間的分配和釋放,編譯器會在new時強制調用構造函數,在delete時強制調用析構函數。因為在C++中初始化和清除工作是強制進行的,用戶無權選擇避開構造函數和析構函數的調用。

要想在這些特殊的情況下能實現對象的創建和銷毀,C++中提供了placement new來應對。在C++中因為可以對運算符進行重載,所以只需對operator new()進行placement重載就能實現在事先分配好的內存空間上調用構造函數來動態創建對象,通過不太常用的對析構函數的顯式調用來銷毀對象。在這種情況下不涉及內存空間的分配和釋放,從而不會導致動態的存儲管理,不會對系統的長期穩定運行帶來影響。

在C++中placement new運算符是通過對new運算符的重載來實現的,它在嵌入式開發中有著重要的用途。因為我們經常想在內存的某個指定位置上放置一個對象(在嵌入式底層開發中,一個對象可能和一個特定的硬件是直接相關的)。

Placement new的主要用途就是:反復使用一塊較大的分配成功的內存來構造不同類型的對象或者它們的數組。比如,可以先申請一個足夠大的字符數組,然后當需要時在它上面構造不同類型的對象或其數組。

定位new運算符的基本語法為

char a[100];

X* xp = new(a) X;

其中X是某個事先定義好類,a是一塊尺寸大于等于sizeof(X)的內存區域的首地址。由于內存區域是事先已經存在的,placement僅僅只是在相應的內存空間上調用X的構造函數來初始化該片內存區域。

下面的例子顯示了如何在一個特定的內存單元里放置一個對象。

#include

using namespace std;

class X {

int i;

public:

X(int ii = 0) : i(ii) {

cout << "this = " << this << endl;

}

~X() {

cout << "X::~X(): " << this << endl;

}

void* operator new(size_t, void* loc) {

return loc;

}

};

int main()

{

int l[10];

cout << "l = " << l << endl;

X* xp = new(l) X(47);

xp->X::~X();

return 0;

}

從中可以看到數組l的地址和構造以及析構函數中輸出的this指針的值是相同的。

注意operator new()僅僅返回了傳遞給它的指針,因此調用者可以決定將對象存放在哪里,這時在該指針所指向的那塊內存上,作new表達式一部分的構造函數將被調用。概括來說就是內存空間是事先分配好的,placement new只是在其上調用構造函數來動態創建對象。

然而在銷毀對象時則需要格外小心,因為空間不是由new創建的,所以在銷毀對象時也應該將對象的析構和內存空間的釋放分開來做。我們要銷毀對象就需要調用析構函數,但此時不能將內存空間釋放掉,因為內存空間不是由new所分配出來的。解決辦法是用非常特殊的語法,我們可以顯式的調用構造函數。例如:

xp->X::~X();

這樣將會只銷毀對象而不會釋放內存。通過placement new和顯式調用析構函數的方式我們就可以在已有的空間上動態地創建和銷毀對象。在嵌入式領域,為了穩定性,我們可以在程序一開始時分配好足夠的空間,在上面構造和銷毀對象,充分享受這種便利性,同時也避免了通常的new和delete所帶來的內存碎片問題。

使用placement new構造起來的對象或其數組,要顯示地調用它們的析構函數來銷毀(析構函數并不釋放對象的內存),千萬不要使用delete。這是因為,placement new構造起來的對象或其數組的大小并不一定等于原來分配的內存大小,而且空間也不一定是在堆上分配的,使用delete的話將會出現嚴重的問題。

上一篇:NFC之PN532使用

下一篇:container_of分析

华清图书馆

0元电子书,限时免费申领

10本华清图书PDF版

扫码关注华清远见公众号
自动回复“2”,即可申领!
熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 国产精品人妻熟女毛片av久久 | 国产又粗又大又黄AA片爱豆 | 麻豆伦理片 | 狼人大香伊蕉国产www亚洲 | 亚洲av第一网站久章草 | 久久精品囯产精品亚洲 | 西游性淫片a级在线观看 | 免费麻豆文化传媒www欢迎你 | 东京热一区二区三区无码视频 | 伊人色综合视频一区二区三区 | 熟女无套高潮内谢视频 | 搞久久 | 亚洲精品久久乱码水蜜桃摄影 | 精品卡一卡二卡3卡高清乱码 | 大地影院mv高清在线观看免费 | 欧洲日韩在线 | 野花社区www在线观看 | 亚洲色无码综合图区手机 | 互换人妻500部 | 人妻中文字幕AV无码专区 | 天干天干天啪啪夜爽爽AV | 色欲久久九色一区二区三区 | 午夜福利影院私人爽爽 | 亚洲AV无码专区亚洲AV网站 | 亚洲欧洲久久av | 婷婷亚洲精品久久无码一区二区三区 | 色偷偷尼玛图亚洲综合 | 色播影院性播影院私人影院 | 麻豆av福利av久久av | 狠狠干狠狠色 | 久久国产精品嫩草影院的使用方法 | 精品系列无码一区二区三区 | 无码av高潮抽搐流白浆 | 精品少妇ay一区二区三区 | 鲁一鲁亚洲无线码 | 极品大乳美女爆乳裸喷水视频 | 德国一级毛片 | 国产欧美亚洲精品第二区软件 | 四虎在线免费播放 | 国产毛多水多高潮高清 | 777米奇久久最新地址 |