gpt4 book ai didi

c++ - 链表析构函数 C++

转载 作者:太空狗 更新时间:2023-10-29 20:34:43 28 4
gpt4 key购买 nike

我正在学习使用链表实现 Stack。这是节点类:

class StudentInfo {
public:
string id, name, course;
double GPA;
StudentInfo *next;
};

这是 Stack 类:

class StackLinkedList {
public:
StudentInfo* top; //pointer to point to the top node
int size; //variable to keep the size of the stack

//constructor
StackLinkedList() {
this->size = 0;
this->top = NULL;
}

//destructor
~StackLinkedList() {
StudentInfo *current = top;
while (top) {
current = current->next;
delete top;
top = current;
}
}

//to add item into stack - push on top
void push(StudentInfo *newStudent) {
if (!top) {
top = newStudent;
return;
}

newStudent->next = top;
top = newStudent;
size++;
}

void main() {
StudentInfo s1("phi", "123", "computer science", 4.0);
StudentInfo s2("abc", "123", "software engineer", 4.0);
StudentInfo s3("zxc", "123", "business management", 4.0);

StackLinkedList list;
StudentInfo *ptr;
ptr = &s1;
list.push(ptr);
ptr = &s2;
list.push(ptr);
ptr = &s3;
list.push(ptr);

};

当我尝试对 push() 和 printAll() 运行单元测试时,一切正常。但是,在调用 destructor() 之后,出现错误 Debug Assertion Failed … is_block_type_valid(header-> _block_use)。并且调试器在 delete top;

处触发了一个断点
//destructor
~StackLinkedList() {
StudentInfo *current = top;
while (top) {
current = current->next;
delete top; //here
top = current;
}
}

如果我在 delete top; 之前放置 top = NULL;,错误就消失了。所以,我对 top = NULL; 语句有点困惑。编辑:NodeType 的构造函数

 StudentInfo(string id, string name, string course, double gpa) {
this->id = id; this->name = name; this->course = course; this->GPA = gpa; this->next = NULL;
}

最佳答案

您通过尝试删除自动存储持续时间的对象来调用未定义行为。

int main() {
StudentInfo s1("phi", "123", "computer science", 4.0);
StudentInfo s2("abc", "123", "software engineer", 4.0);
StudentInfo s3("zxc", "123", "business management", 4.0);

StackLinkedList list;
StudentInfo *ptr;
ptr = &s1;
list.push(ptr);
ptr = &s2;
list.push(ptr);
ptr = &s3;
list.push(ptr);

};

如您所见,s1s2s3自动存储持续时间的对象(又名,编译器会在它们的生命周期结束时自动调用它们的析构函数)。

但是您将它们的地址传递给 list,其析构函数 deletes 在其链表详细信息中的所有指针,在销毁时....永远不要调用 delete 在指向不是使用 new 创建的对象的指针上。


一些补充说明:

  • void main() 在 C++ 中是非法的。您使用的是较旧的编译器吗? ..
  • 每个对象都应该管理它的资源。例如,std::forward_list 使用分配器在内部管理其节点的分配。我建议您重新设计 StackLinkedList 以在内部管理其节点,这样客户端就永远不会担心生命周期。
  • 您应该阅读 Rule of Three , 和 The Rule of Five
  • 您的代码中还有其他一些错误,我没有触及。

关于c++ - 链表析构函数 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46758780/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com