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[] 或者分配的內存時候單獨分配。

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

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