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

How to resolve these memory leak in Doubly Linked List?

本文关键字:内存 泄漏 链表 何解决 解决      更新时间:2023-10-16

我一直在尝试使用简单的删除 [] 名称删除内存泄漏,但我认为它没有成功删除,因为我仍然有内存泄漏。我还有一个 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

我的析构函数只包含同一类下的 delete all 函数

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

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

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

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