如何在C ++中初始化本地struct对象(不能将新对象创建为局部变量)?

时间:2018-01-08 08:46:05

标签: c++ pointers constructor linked-list

我正在学习C ++,我想实现一个简单的链表。这是我的代码。

#include <vector>
#include <iostream>
struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(nullptr) {}
};
int main()
{
    ListNode start = ListNode(-1);
    ListNode *startptr = &start;
    for(int i=0;i<3;i++)
    {
        ListNode foo=ListNode(i);
        startptr->next = &foo;
        startptr = startptr->next;
    }

}

但是在运行代码之后,我发现出了问题。在代码中

ListNode foo=ListNode(i)

foo始终具有startptr无法指向新节点的相同地址。 我切换到调试模式,并得到这张图片:

enter image description here

似乎只有一个foo,每次我'创建'名为ListNode的新foo时,最后ListNode都会被覆盖。

我曾经使用Python,但我没有遇到过这样的问题。这真让我感到困惑。

1 个答案:

答案 0 :(得分:4)

对于ListNode foo=ListNode(i); startptr->next = &foo;,您指的是具有自动存储持续时间和块范围的对象。因此,对象foo将在每个循环周期结束时被销毁,稍后引用它会产生未定义的行为。

链接列表的节点通常使用动态存储持续时间创建,即使用new。请参阅以下适用的代码说明:

int main()
{
    ListNode *start = new ListNode(-1);
    ListNode *ptr = start;
    for(int i=0;i<3;i++)
    {
        ListNode *foo = new ListNode(i);
        ptr->next = foo;
        ptr = ptr->next;
    }
}