久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

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

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

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

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

通常的(de)(de)new運算符會在(zai)堆(dui)中(zhong)(zhong)動(dong)態分(fen)配(pei)內存(cun),并(bing)在(zai)成(cheng)功(gong)分(fen)配(pei)的(de)(de)內存(cun)空間(jian)上調(diao)用(yong)(yong)相應(ying)對象的(de)(de)構(gou)(gou)造函(han)數(shu),而(er)(er)delete運算符會先在(zai)該內存(cun)空間(jian)上調(diao)用(yong)(yong)相應(ying)對象的(de)(de)析構(gou)(gou)函(han)數(shu),然(ran)后釋放該內存(cun)空間(jian)。然(ran)而(er)(er)在(zai)C++中(zhong)(zhong),可以通過(guo)對new和delete的(de)(de)重(zhong)載來實(shi)現特(te)殊的(de)(de)功(gong)能。不過(guo)在(zai)程序員編寫的(de)(de)new和delete的(de)(de)重(zhong)載函(han)數(shu)中(zhong)(zhong)都只是負責內存(cun)空間(jian)的(de)(de)分(fen)配(pei)和釋放,編譯(yi)器會在(zai)new時強(qiang)制(zhi)調(diao)用(yong)(yong)構(gou)(gou)造函(han)數(shu),在(zai)delete時強(qiang)制(zhi)調(diao)用(yong)(yong)析構(gou)(gou)函(han)數(shu)。因為在(zai)C++中(zhong)(zhong)初(chu)始化和清(qing)除工作是強(qiang)制(zhi)進行的(de)(de),用(yong)(yong)戶無權選擇避開構(gou)(gou)造函(han)數(shu)和析構(gou)(gou)函(han)數(shu)的(de)(de)調(diao)用(yong)(yong)。

要(yao)想在(zai)這些(xie)特殊的(de)(de)情(qing)況(kuang)下能實(shi)現對象的(de)(de)創(chuang)建和銷(xiao)毀(hui),C++中提供了placement new來(lai)應(ying)對。在(zai)C++中因(yin)為可以對運算符(fu)進行重載,所以只需對operator new()進行placement重載就能實(shi)現在(zai)事先分(fen)配好(hao)的(de)(de)內存(cun)空(kong)間(jian)上調用(yong)構造函(han)數來(lai)動態創(chuang)建對象,通過不(bu)太常用(yong)的(de)(de)對析構函(han)數的(de)(de)顯式(shi)調用(yong)來(lai)銷(xiao)毀(hui)對象。在(zai)這種情(qing)況(kuang)下不(bu)涉及內存(cun)空(kong)間(jian)的(de)(de)分(fen)配和釋放,從而不(bu)會(hui)導致動態的(de)(de)存(cun)儲管理(li),不(bu)會(hui)對系統的(de)(de)長(chang)期穩定運行帶(dai)來(lai)影響。

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

Placement new的(de)(de)(de)主要用(yong)途(tu)就(jiu)是(shi):反(fan)復使用(yong)一塊較大的(de)(de)(de)分配成功的(de)(de)(de)內存(cun)來構造(zao)不(bu)同類(lei)(lei)型(xing)的(de)(de)(de)對(dui)象或者它們的(de)(de)(de)數組(zu)(zu)。比如,可以先(xian)申請(qing)一個足夠大的(de)(de)(de)字符數組(zu)(zu),然后當需要時在(zai)它上面構造(zao)不(bu)同類(lei)(lei)型(xing)的(de)(de)(de)對(dui)象或其數組(zu)(zu)。

定(ding)位new運算符的基本語法(fa)為

char a[100];

X* xp = new(a) X;

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

下(xia)面的(de)例子(zi)顯示了如何在一個(ge)特定的(de)內存單元里(li)放置(zhi)一個(ge)對象。

#include

using namespace std;

class X {

int i;

public:

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

cout <&lt; "this = " << this << endl;

}

~X() {

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

}

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

return loc;

}

};

int main()

{

int l[10];

cout << &quot;l = " << l << endl;

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

xp->X::~X();

return 0;

}

從(cong)中(zhong)可以(yi)看(kan)到數組l的地(di)址和(he)構(gou)造以(yi)及析構(gou)函數中(zhong)輸(shu)出(chu)的this指(zhi)針的值(zhi)是相同(tong)的。

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

然而在銷毀對(dui)象時則(ze)需要(yao)(yao)格外小(xiao)心(xin),因為空(kong)間(jian)不是(shi)由(you)new創建的,所以在銷毀對(dui)象時也應該(gai)將(jiang)(jiang)對(dui)象的析構(gou)和內(nei)存(cun)空(kong)間(jian)的釋(shi)放(fang)(fang)分(fen)開來(lai)做。我們要(yao)(yao)銷毀對(dui)象就需要(yao)(yao)調用析構(gou)函數,但此(ci)時不能將(jiang)(jiang)內(nei)存(cun)空(kong)間(jian)釋(shi)放(fang)(fang)掉,因為內(nei)存(cun)空(kong)間(jian)不是(shi)由(you)new所分(fen)配(pei)出來(lai)的。解決辦法是(shi)用非(fei)常特殊(shu)的語法,我們可以顯式(shi)的調用構(gou)造(zao)函數。例如(ru):

xp->X::~X();

這(zhe)(zhe)樣將(jiang)會(hui)只(zhi)銷毀(hui)對象而不(bu)會(hui)釋放內存(cun)。通過placement new和顯(xian)式(shi)調用析構(gou)函數的(de)方式(shi)我(wo)們就可以(yi)在(zai)已有的(de)空間上(shang)動態地創建和銷毀(hui)對象。在(zai)嵌入式(shi)領(ling)域(yu),為(wei)了穩定性(xing),我(wo)們可以(yi)在(zai)程(cheng)序一(yi)開始時(shi)分(fen)配好足(zu)夠(gou)的(de)空間,在(zai)上(shang)面(mian)構(gou)造和銷毀(hui)對象,充分(fen)享(xiang)受這(zhe)(zhe)種(zhong)便利性(xing),同時(shi)也避免了通常的(de)new和delete所(suo)帶來(lai)的(de)內存(cun)碎片問題。

使用(yong)(yong)placement new構(gou)(gou)造(zao)起(qi)來的(de)對(dui)(dui)象或(huo)其數(shu)組(zu),要(yao)顯示(shi)地調用(yong)(yong)它們的(de)析(xi)構(gou)(gou)函數(shu)來銷毀(析(xi)構(gou)(gou)函數(shu)并不(bu)釋放對(dui)(dui)象的(de)內存),千萬不(bu)要(yao)使用(yong)(yong)delete。這(zhe)是因為,placement new構(gou)(gou)造(zao)起(qi)來的(de)對(dui)(dui)象或(huo)其數(shu)組(zu)的(de)大小并不(bu)一定等(deng)于原來分(fen)配(pei)的(de)內存大小,而且空間也不(bu)一定是在堆上分(fen)配(pei)的(de),使用(yong)(yong)delete的(de)話將會出現嚴(yan)重的(de)問題。

上一篇:NFC之PN532使用

下一篇:container_of分析

熱點文章推薦
華清學(xue)員就業榜單
高薪學(xue)員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓(xun)洽(qia)談專線:010-82525379 院校合(he)作洽談專(zhuan)線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部