C ++指针节点
当我以这种方式写下我的代码时,它会返回奇怪的错误。
struct Student{
int val;
Student* next;
Student(int a){
val = a;
next = NULL;
}
};
int main(){
Student begin(0);
Student *head = &begin;
Student *pointer = head;
for(int i=0;i<3;i++){
pointer->val = i;
Student next(0);
pointer->next = &next;
pointer = pointer->next;
}
while(head != NULL){
cout<< head-> val<<endl;
head = head ->next;
}
}
在我以这种方式改变循环之后,它就可以工作。
for(int i=0;i<3;i++){
pointer->val = i;
pointer->next = new Student(0);
pointer = pointer->next;
}
为什么会发生? 这两种方式初始化下一个节点有什么不同?
您正在设置节点以指向本地堆栈变量,随着您进入for循环的下一次迭代,该变量正在被破坏。
您对new Student
使用通过进行堆分配来解决这个问题
很多关于堆栈vs栈堆内存堆栈内存的讨论
当你宣布这样的学生
Student next(0);
它在堆栈上分配临时内存,只应在该块中认为可用。
当你使用new
你在可以在任何地方使用的堆上分配内存。 注意内存泄漏并始终定义析构函数。
new Student(0);
for(int i=0;i<3;i++){
pointer->val = i;
Student next(0);
pointer->next = &next;
pointer = pointer->next;
}
您正在自动存储上创建对象学生(通常作为堆栈实现)。 然后你在链表中存储一个指向这个对象的指针。 当'学生'超出范围时,对象被删除。 现在你的指针是一个悬挂指针。 取消引用该指针现在是未定义的行为。
pointer->next = new Student(0);
在动态存储上创建(通常以堆的形式实现)。 这个对象将一直存在,直到你告诉它死(删除它)。
我建议你阅读C ++中堆栈/堆之间的差异。 如果你想学习C ++,这是一个非常重要的话题。
另外,确保你删除了任何新的对象! 如果你不这样做,你的程序中会出现内存泄漏。
链接地址: http://www.djcxy.com/p/79795.html上一篇: C++ Pointer node
下一篇: What's the difference between an array and a pointer in C exactly?