C++ 什么';删除(ptr->;下一步)和删除q(q=ptr->;下一步)之间的区别是什么?

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++; }

代码用于linkList,我想释放已删除节点的内存,但有一种方法会导致内存泄漏。两种方式的区别是什么

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