我最近在试验链接列表时遇到了一个问题。当我使用函数来链接在其数据字段中具有字符串的新节点时,它不起作用。我的意思是,当函数(linkin()见下文)返回时,字符串(函数的本地)被销毁,因此字符串字段似乎未初始化。
但是,当我使用int执行完全相同的操作时,它似乎工作得很好。我使用的代码如下(它的int版本,但是使val成为字符串而不是int来查看其他版本)。有人可以向我解释发生了什么吗?
谢谢!
struct testlist {
int val;
testlist *next;
};
void linkin ( testlist *a );
int main() {
testlist test;
linkin(&test);
cout << test.next->val <<endl;
}
void linkin ( testlist *a )
{
testlist b;
b.val=1;
a->next = &b;
cout << a->next->val <<endl;
}
答案 0 :(得分:4)
testlist b;
a->next = &b;
a->next
指向一个本地临时对象,它将在从函数返回后立即被销毁。在从函数中取消引用后,它会调用未定义的行为。
这是未定义的行为,有时它有效,有时不行。
同样在C ++中有一个链表:std::list
。另一方面,您可以使用std::unique_ptr
等智能指针而不是裸指针。我已经根据你的容器编写了一个智能指针:
struct List
{
int val;
unique_ptr<List> next;
};
void linkin (List &a)
{
unique_ptr<List> b(new List);
b->val = 1;
a.next = move(b); // After move you can't use b anymore
cout << a.next->val << endl;
}
int main()
{
List test;
linkin(test);
cout << test.next->val <<endl;
}
答案 1 :(得分:0)
直接离开,在linkin()
我可以看到你在a
中将一个指针存放到一个将超出范围的对象 - 即:被销毁。
有可能出现来处理int而不是像std :: string这样的复杂类型。尽管出现这是破解的代码 - 尝试重写linkin()
:
void linkin ( testlist& a )
{
testlist* b = new testlist;
b->val=1;
a->next = b;
cout << a->next->val <<endl;
}