目錄
為吉安等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及吉安網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站建設(shè)、做網(wǎng)站、吉安網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!1.關(guān)于new與delete
2.智能指針的定制刪除器
這里我想介紹的是new[]與delete[]沒(méi)有配套使用帶來(lái)的影響。這個(gè)是否發(fā)生錯(cuò)誤和使用的ide有很大的關(guān)系。(這里我用vs平臺(tái)做示例)
如果對(duì)內(nèi)置類(lèi)型采用new[]來(lái)開(kāi)辟開(kāi)辟空間,再用delete來(lái)釋放空間是沒(méi)有影響的。
這里是可以通過(guò)編譯的。
不過(guò)若是對(duì)自定義類(lèi)型采用這種方式釋放就會(huì)報(bào)錯(cuò)。
這里我們就要深入的了解一下new[]和delete[]的工作方式(針對(duì)自定義類(lèi)型)。new[]的時(shí)候會(huì)先調(diào)用operator new[]開(kāi)出空間,再用開(kāi)出的空間進(jìn)行調(diào)用指定次數(shù)的構(gòu)造函數(shù)。delete[]的時(shí)候會(huì)先調(diào)用operator delete[]來(lái)進(jìn)行指定次數(shù)的析構(gòu),再將空間釋放。
核心問(wèn)題:new[n]完了,delete[]如何拿到這個(gè)n值呢?
vs下的處理方式:
如圖,以開(kāi)三個(gè)Node空間來(lái)舉例,編譯器會(huì)默認(rèn)多開(kāi)4個(gè)字節(jié)來(lái)計(jì)數(shù),new[]結(jié)束,指針會(huì)偏移至計(jì)數(shù)空間的結(jié)尾。這時(shí),我們?nèi)绻捎胐elete方式來(lái)釋放空間,析構(gòu)或許可以正常執(zhí)行一次,Node1或許會(huì)被析構(gòu)。不過(guò)此時(shí)找不到空間的起始位置,delete整個(gè)空間時(shí)對(duì)應(yīng)不上正確位置就會(huì)報(bào)錯(cuò)。
為了解決上述問(wèn)題,智能指針給了定制刪除器的方案。
unique_ptr:
他的定制刪除器只接收傳類(lèi)型。
#includeusing namespace std;
class Node
{
public:
~Node()
{
cout<< "~Node"<< endl;
}
private:
int _val=0;
};
templatestruct DelteAryy //搞一個(gè)專門(mén)delete[]的
{
void operator()(T* t)
{
delete[] t;
}
};
int main()
{
unique_ptr>sp1(new Node[5]);
return 0;
}
如圖,成功析構(gòu)5次。
shared_ptr:
這里我們可以傳對(duì)象給定制刪除器。因此用c++的lambda就會(huì)非常省事。
lambda可以參考:c++11有關(guān)新特性?
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
標(biāo)題名稱:c++new和delete的匹配問(wèn)題與raii的定制刪除器-創(chuàng)新互聯(lián)
分享路徑:http://aaarwkj.com/article46/pgheg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、ChatGPT、云服務(wù)器、小程序開(kāi)發(fā)、用戶體驗(yàn)、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容