第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

到底應(yīng)該怎么刪除呢?真的不想搞到內(nèi)存泄露。

到底應(yīng)該怎么刪除呢?真的不想搞到內(nèi)存泄露。

呼如林 2023-04-22 10:06:07
最近在寫A*算法,遇到一個(gè)問題,詳細(xì)說來是這樣的(源碼太長(zhǎng)我先說大概情況)聲明: vector<TAStarNode *> openlist; 是一個(gè)指針的vector然后東西是這樣放進(jìn)去的:有一個(gè)大的循環(huán){TAStarNode * p=NULL;while(!p)p = new TAStarNode[8];當(dāng)然,接下來會(huì)給它們賦值。然后用一個(gè)循環(huán)把這8個(gè)都取址之后push_back進(jìn)openlist里邊。各種刪除、修改處理}一直循環(huán),也就是說,p指向的地址是不斷改變的,而且中間還要用到那些點(diǎn),沒辦法直接delete[] p。openlist中每個(gè)指針都只指向一個(gè)元素。所以我就放在最后在一個(gè)函數(shù)SafeDel()里邊delete全部了。查了些資料之后是這樣子寫:iter=openlist.begin();for(;iter!=openlist.end();){delete *iter;iter=openlist.erase(iter);//erase會(huì)返回被刪除迭代器后面那個(gè)}但是會(huì)卡住,調(diào)試發(fā)現(xiàn)是第一次執(zhí)行到 delete *iter 就不會(huì)動(dòng)了。另外,看了前面問的也試過這樣for(int i=0;i<openlist.size();i++) delete openlist[i];結(jié)果也一樣。在delete那里卡住走不下去,光標(biāo)一直閃啊閃。源碼太長(zhǎng),連剩下字?jǐn)?shù)只夠放頭文件,所以就不發(fā)上來了
查看完整描述

3 回答

?
慕沐林林

TA貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個(gè)贊

p = new TAStarNode[8];
當(dāng)然,接下來會(huì)給它們賦值。
然后用一個(gè)循環(huán)把這8個(gè)都取址之后push_back進(jìn)openlist里邊。
各種刪除、修改處理

這個(gè)樣子的話,只可以使用delete[] p,將所有分配的空間都釋放掉。
這時(shí)如果delete (p+1),delete (p+2)。。。delete(p+7),都是
不對(duì)的,具體編譯器會(huì)怎么處理這種情況,就不知道了。因?yàn)榫幾g器“認(rèn)為”
它沒有分配(p+1)。
可以這么想:p=new xxx[8] 時(shí),編譯器將分配的內(nèi)存的首地址和分配的字節(jié)數(shù)
存在了某個(gè)地方,以后刪除的時(shí)候要從這里取回這些存儲(chǔ)的信息,但是這里并
沒有存儲(chǔ)首地址為(p+1)。。。(p+7)的相關(guān)信息。就有可能刪除出錯(cuò)。

后面的那些代碼就是在刪除(p+1)。。。(p+7)。
可以改作一次性刪除delete[] 或者分配的內(nèi)存時(shí)候單獨(dú)分配。


查看完整回答
反對(duì) 回復(fù) 2023-04-25
?
一只甜甜圈

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超5個(gè)贊

p = new TAStarNode[8];
p是一個(gè)指針,指向一個(gè)TAStarNode數(shù)組。 你是想釋放這里new的內(nèi)存吧。
大的循環(huán)
{
TAStarNode * p=NULL;
while(!p)
p = new TAStarNode[8];
openlist.push_back(p);
}

最后時(shí)候,循環(huán)遍歷刪除即可。 
關(guān)于刪除有2個(gè)選擇:
vector<TAStarNode *>::iterator it = openlist.begin();
for(; it != openlist.end(); it++)
{
TAStarNode* p = it;
delete [] p;
p = NULL;
}
openlist.clear();

-----------------------------------
vector<TAStarNode *>::iterator it = openlist.begin();
for(; it != openlist.end(); it++)
{
TAStarNode* p = it;
delete [] p;
p = NULL;
openlist.erase(it);
it = openlist.begin();
}


查看完整回答
反對(duì) 回復(fù) 2023-04-25
?
慕森王

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個(gè)贊

你的動(dòng)態(tài)內(nèi)存申請(qǐng)了一份,你卻釋放了八次
你對(duì)動(dòng)態(tài)內(nèi)存的分配和釋放的機(jī)制不理解。這是運(yùn)行時(shí)錯(cuò)誤。
你的這句代碼“p= new TAStarNode[8];”其本質(zhì)是這樣的 從堆中分配 8*sizeof( TAStarNode)大小的內(nèi)存,并且調(diào)用8次TASTarNode的構(gòu)造函數(shù),初始化你的動(dòng)態(tài)內(nèi)存。注意,分配內(nèi)存是,相關(guān)的動(dòng)態(tài)存儲(chǔ)管理的數(shù)據(jù)結(jié)構(gòu)(空閑鏈表或位圖)記錄了你申請(qǐng)的動(dòng)態(tài)內(nèi)存的首地址和大小。
而且,這片內(nèi)存你再釋放是只能釋放一次,因?yàn)閿?shù)據(jù)結(jié)構(gòu)里就記錄了這樣一份首地址和大小。釋放時(shí),將自首地址起,連續(xù)的在數(shù)據(jù)結(jié)構(gòu)中指定大小的內(nèi)存歸還給空閑存儲(chǔ)區(qū),然后調(diào)用析構(gòu)函數(shù)。
我給你說一下delete和delete[]的區(qū)別,如果動(dòng)態(tài)創(chuàng)建一個(gè)對(duì)象數(shù)組,用delete只能對(duì)數(shù)據(jù)中的第0個(gè)對(duì)象元素調(diào)用析構(gòu)函數(shù)。其他不對(duì)象元素不可能調(diào)用。而delete[] 對(duì)所有數(shù)組中所有對(duì)象元素調(diào)用析構(gòu)函數(shù)。如果你的數(shù)組中對(duì)象在創(chuàng)建時(shí),其成員也是動(dòng)態(tài)創(chuàng)建的,則用delete必然內(nèi)存泄露。
你的這一句代碼delete *iter;反復(fù)執(zhí)行,多次釋放動(dòng)態(tài)內(nèi)存,第二次循環(huán)時(shí),必然錯(cuò)誤。
如果你想編程進(jìn)階的話,不能只看編程書,操作系統(tǒng),和數(shù)據(jù)結(jié)構(gòu)必看。其實(shí)我就是當(dāng)初看操作系統(tǒng)中動(dòng)態(tài)存儲(chǔ)管理,才理解這點(diǎn)的。

查看完整回答
反對(duì) 回復(fù) 2023-04-25
  • 3 回答
  • 0 關(guān)注
  • 158 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)