C++ 什么';删除(ptr->;下一步)和删除q(q=ptr->;下一步)之间的区别是什么?
代码用于linkList,我想释放已删除节点的内存,但有一种方法会导致内存泄漏。两种方式的区别是什么C++ 什么';删除(ptr->;下一步)和删除q(q=ptr->;下一步)之间的区别是什么?,c++,memory-leaks,C++,Memory Leaks,代码用于linkList,我想释放已删除节点的内存,但有一种方法会导致内存泄漏。两种方式的区别是什么 bool LinkList::deleteElement(int i, EleMentType &e) { int j = 0; List Ptr = linkList; while (Ptr->Next && j < i - 1) { Ptr = Ptr->Next; j++; }
bool LinkList::deleteElement(int i, EleMentType &e) {
int j = 0;
List Ptr = linkList;
while (Ptr->Next && j < i - 1) {
Ptr = Ptr->Next;
j++;
}
if (!Ptr->Next || j > i - 1) {
std::cout << "Failed to delete an element\n";
return false;
}
// Memory Leak
// Ptr->Next = Ptr->Next->Next;
// e = Ptr->Next->Data;
// delete Ptr->Next;
/* without Memory Leak */
List q = Ptr->Next;
Ptr->Next = q->Next;
e = q->Data;
delete q;
return true;
}
bool链接列表::deletelement(inti,EleMentType&e){
int j=0;
列表Ptr=链接列表;
while(Ptr->Next&&jNext;
j++;
}
如果(!Ptr->Next | j>i-1){
std::cout Next=Ptr->Next->Next;
//e=Ptr->Next->Data;
//删除Ptr->Next;
/*无内存泄漏*/
列表q=Ptr->Next;
Ptr->Next=q->Next;
e=q->数据;
删除q;
返回true;
}
不同之处在于您没有删除相同的节点:
Ptr->Next = Ptr->Next->Next; // modifies Ptr->Next, original value is lost
e = Ptr->Next->Data; // Ptr->Next may be null, causing undefined behavior
delete Ptr->Next; // deleting a node that is still pointed to by the list, potential future undefined behavior.
注意,将指针隐藏在typedef后面被认为是不好的样式
还请注意,您无法使用此函数删除第一个节点(偏移量
0
),尽管为此目的直接编写修改链接列表的代码会很容易。此代码非常糟糕。看起来您在类型定义
(列表
)后面隐藏了一个指针:-(intx=1;x=x+1;printf(“%d\n”,x);
和intx=1;intq=x;x=q+1;printf(“%d\n”,q);
?