如何解决双链表中的这些内存泄漏?

问题描述 投票:-1回答:2

我一直在尝试使用简单的delete []名称来消除内存泄漏,但是我认为它没有被成功删除,因为我仍有内存泄漏。我还有一个DeleteAll()函数,该函数遍历节点,但似乎并未删除对象名称。

下面的代码在add函数下,我认为这可能是导致内存泄漏的原因:在CDoublyLinkedList类下

        CListNode*      work        = NULL;                 // holds head
        CListNode*      prev        = NULL;                 // previous
        CListNode*      newData     = new CListNode();      // instantiation of node class
        char* name = NULL;                                  //char array for name

        /// ________Increase array size of name depending on input
        name = new char[strlen(iName) + 1];
        /// ________Copy string to char
        strcpy_s(name, strlen(iName) + 1, iName);

        newData->SetName(name);     // Set user input to character list

我的析构函数仅包含删除同一类下的所有函数

void DeleteALL()
    {
        CListNode* next;
        CListNode* current;

        current = head;
        while(current != NULL) {
            next = current->GetNext();
            delete current;
            current = next;
        }
        current = NULL;
        head = NULL;
        tail = NULL;
        next = NULL;
    }

这是我的主旨:

CDoublyLinkedList       element         =       new CDoublyLinkedList;      //list object
Switch(option) {
            /// ____Option Add name
            case '1':
                cout << "Enter name:" << "\t";
                cin >> temp;

                /// ________If input is not 4-25 characters<br></br>
                /// ____________Loop while input is not 4-25 characters<br></br>
                /// ________________Ask for new input<br></br>
                /// ____________End loop<br></br>
                /// ________End if<br></br>
                if((temp.length() >= 3) == false
                    || (temp.length() <= 25) == false) {

                    while((temp.length() >= 3) == false
                        || (temp.length() <= 25) == false) {

                        cout << "Input should be 3-25 characters. Try again." << "\n";
                        cout << "Enter name:" << "\t";
                        cin >> temp;
                    }
                }
                /// ________Add input to list
                element->AddSortList(temp.c_str());

我通过以下方式删除了我主要方法上的对象:

if(element != NULL) {
        delete[] element;
        element = NULL;
    }

Class CNode仅包含get和set

class CListNode
{
private:
    CListNode*          mNext;              // Next item pointer
    CListNode*          mPrev;              // Previous item pointer
    char*               mNameElement;       // List element pointer

public:
    /// <summary>
    /// Node initializer to set as NULL
    /// </summary>
    /// <dt>Date:</dt>
    /// 2019/10/03 Created  by JAC.Tayag (SAT-A)    TRAINING
    CListNode()
    {
        mNext = NULL;
        mPrev = NULL;
    }

    ~CListNode()
    {
        CListNode* next;
        CListNode* current;

        current = mPrev;
        while(current != NULL) {
            next = current->GetNext();
            delete current;
            current = next;
        }
        current = NULL;
        mNext = NULL;
        mPrev = NULL;
        next = NULL;
    }
    /// <summary>
    /// Assign input name
    /// </summary>
    /// <dt>Date:</dt>
    /// 2019/10/03 Created  by JAC.Tayag (SAT-A)    TRAINING
    void SetName(char* iNameElement)
    {
        mNameElement = iNameElement;
    }

    /// <summary>
    /// Assign next pointer
    /// </summary>
    /// <dt>Date:</dt>
    /// 2019/10/03 Created  by JAC.Tayag (SAT-A)    TRAINING
    void SetNext(CListNode* iNext)
    {
        mNext = iNext;
    }

    /// <summary>
    /// Assign previous pointer
    /// </summary>
    /// <dt>Date:</dt>
    /// 2019/10/03 Created  by JAC.Tayag (SAT-A)    TRAINING
    void SetPrev(CListNode* iPrev)
    {
        mPrev = iPrev;
    }

    /// <summary>
    /// Return input name
    /// </summary>
    /// <dt>Date:</dt>
    /// 2019/10/03 Created  by JAC.Tayag (SAT-A)    TRAINING
    char* GetName()
    {
        return mNameElement;
    }

    /// <summary>
    /// Return next pointer
    /// </summary>
    /// <dt>Date:</dt>
    /// 2019/10/03 Created  by JAC.Tayag (SAT-A)    TRAINING
    CListNode* GetNext()
    {
        return mNext;
    }

    /// <summary>
    /// Return previous pointer
    /// </summary>
    /// <dt>Date:</dt>
    /// 2019/10/03 Created  by JAC.Tayag (SAT-A)    TRAINING
    CListNode* GetPrev()
    {
        return mPrev;
    }
c++ memory-management destructor doubly-linked-list
2个回答
0
投票

您可以删除与单个链接列表相同的内容。

node* element = head;
while( element != 0 ) {
    node* next = element->next;
    delete element;
    element = next;
}
head = 0;

0
投票

[您尝试删除ListNode析构函数中的整个链,因此,每当某个ListNode引用另一个节点时,它将对跟随者引用的所有节点进行递归所有权。

我认为这不是一个好方法。

您可能会在复杂的程序中容易地进行两次删除。恕我直言,删除下一​​个/上一个节点不是ListNode的责任

© www.soinside.com 2019 - 2024. All rights reserved.