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ú)分配。

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();
}

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)的。
添加回答
舉報(bào)