0

我最近在尝试使用链表时遇到了一个问题。当我使用一个函数来链接一个在其数据字段中有一个字符串的新节点时,它不起作用。我的意思是当函数(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;
}
4

2 回答 2

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;
}
于 2013-10-29T15:37:48.387 回答
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;
}    
于 2013-10-29T15:40:14.623 回答