一個存放CObject*型別的C++鏈表,鏈表中的值都是串行化寫入的值,在洗掉其中的結點時,RemoveAt之后,還需要delete嗎?
比如下面一段代碼
//定義的鏈表
typedef CTypedPtrList<CObList, CObject *> CLnObjList;
CLnObjList m_objects;
CFile f;
CString FilePath = "F\\Project\\CH.d" ;
CArchive Sama_ar(&f, CArchive::load);
m_objects.Serialize(Sama_ar);
f.Close();
POSITION pos = m_objects.GetHeadPosition();
while (pos != NULL) {
CLnObj *pObj = m_objects.GetAt(pos);
m_objects.RemoveAt(pos);
delete pObj;//我想問一下,這里需不需要
pos = m_objects.GetHeadPosition();
}
針對上述中代碼,想知道如果不delete會不會導致記憶體泄漏啊。
本人萌新,萬分感謝各位大佬的幫助

uj5u.com熱心網友回復:
關鍵看你分配插入的時候是怎么操作的, 如果是用 new 分配的就得有對應的delete銷毀uj5u.com熱心網友回復:
嗯嗯,我知道如果分配插入的時候是new動態開辟空間,在洗掉該結點的時候需要delete,但是如果這個鏈表是通過串行化從檔案里讀出的值呢,為了方便我把上述函式中的CObject的串行化函式貼出來(源代碼中鏈表存放的是我自己寫的從CObject繼承出來的一個子類CLnObj,但是為了便于理解我就把它寫成了CObject,所以希望大家不要糾結我怎么能夠重寫CObject的串行化函式)
void CLnObj::Serialize(CArchive &ar)
{
int i;
CObject::Serialize(ar);
if (ar.IsStoring()) {
ar<<ID<<AVNum<<DVNum;
} else {
ar>>ID>>AVNum>>DVNum;
}
//這些變數都是int型
uj5u.com熱心網友回復:
你添加元素用什么方式完全沒影響啊。串列析構的時候是不會去釋放指標的,你不釋放誰釋放?uj5u.com熱心網友回復:
也就是說鏈表析構之后,還需要手動釋放指標。如果是new出來的空間,需要用delete去釋放。那我想問一下,如果是串行化進來的指標(也就是鏈表的結點),也是用delete去釋放這個指標的空間嗎uj5u.com熱心網友回復:
沒區別,反正解構式不會幫你去釋放。你呼叫Serialize創建的節點仍舊算是你申請的記憶體。
uj5u.com熱心網友回復:
CLnObj *pObj不需要 delete
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/51472.html
標籤:基礎類
