我一直在尝试使用简单的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;
}
您可以删除与单个链接列表相同的内容。
node* element = head;
while( element != 0 ) {
node* next = element->next;
delete element;
element = next;
}
head = 0;
[您尝试删除ListNode析构函数中的整个链,因此,每当某个ListNode引用另一个节点时,它将对跟随者引用的所有节点进行递归所有权。
我认为这不是一个好方法。
您可能会在复杂的程序中容易地进行两次删除。恕我直言,删除下一个/上一个节点不是ListNode的责任