【发布时间】:2021-08-11 17:52:37
【问题描述】:
我想通过在程序结束时删除所有节点来释放内存,但我也有删除特定节点的功能(重载运算符)。如果我要删除特定的节点类,则调用析构函数。谁能解释一下为什么,以及如何解决它。
类声明
class StudentList
{
private:
typedef struct student_node
{
student_node* prevSt;
//######Student DATA######
string surname;
string name;
string father_name;
Date birthday;
int year;
string faculty;
string departament;
string group;
string ID_number;
string sex;
//########################
SessionList session_data;
int session_count;
//########################
student_node* nextSt;
}* student_nodePtr;
student_nodePtr headSt;
student_nodePtr currSt;
student_nodePtr tailSt;
student_nodePtr tempSt;
public:
StudentList();
~StudentList();
StudentList operator-(student_nodePtr selectedSt);
};
构造函数、析构函数和重载运算符
StudentList::StudentList()
{
headSt = NULL;
currSt = NULL;
tailSt = NULL;
tempSt = NULL;
}
StudentList::~StudentList()
{
cout << "What!?" << endl;
}
StudentList StudentList::operator-(student_nodePtr selectedSt)
{
if(headSt == NULL || selectedSt == NULL)
{
return *this;
}
if(headSt == selectedSt)
{
headSt = selectedSt->nextSt;
}
if(tailSt == selectedSt)
{
tailSt = selectedSt->prevSt;
}
if(selectedSt->prevSt != NULL)
{
selectedSt->prevSt->nextSt = selectedSt->nextSt;
}
delete selectedSt;
return *this;
}
【问题讨论】:
-
首先,C++ 中不需要
typedef。所有结构或类名都是类型名。 -
请提供minimal reproducible example。现在我不知道你是如何运行程序的,你给程序提供了什么输入,你看到了什么输出。
-
请更改您的析构函数以提供更多信息:
cout << "What!?: " << this << endl;-- 然后问问自己,该对象从何而来。您将看到它与您在调用函数中使用的StudentList对象不同。 -
非常感谢您的帮助
-
此外,
StudentList对象中唯一可访问的函数是StudentList()、~StudentList()和operator -。那么,如果其他所有内容都是private,您如何编写一个对StudentList执行任何操作的程序?
标签: c++ class destructor doubly-linked-list