亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

到底應該怎么刪除呢?真的不想搞到內存泄露。

到底應該怎么刪除呢?真的不想搞到內存泄露。

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

3 回答

?
慕沐林林

TA貢獻2016條經驗 獲得超9個贊

p = new TAStarNode[8];
當然,接下來會給它們賦值。
然后用一個循環把這8個都取址之后push_back進openlist里邊。
各種刪除、修改處理

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

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


查看完整回答
反對 回復 2023-04-25
?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

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

最后時候,循環遍歷刪除即可。 
關于刪除有2個選擇:
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();
}


查看完整回答
反對 回復 2023-04-25
?
慕森王

TA貢獻1777條經驗 獲得超3個贊

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

查看完整回答
反對 回復 2023-04-25
  • 3 回答
  • 0 關注
  • 161 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號