繁体   English   中英

使用向量初始化链表时的c ++分段错误

[英]c++ segmentation fault when using vector to initialize linkedlist

我打算使用向量初始化链表

这是代码:

#include <vector>
#include <iostream>

using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

int main() {
    int n = 10;
    vector<ListNode> vecListNode;
    for (int i = 0; i != n; ++ i) {
        vecListNode.push_back(ListNode(i));
        if (i) {
            vecListNode[i-1].next = &vecListNode[i];
        }
    }
    ListNode *root = &vecListNode[0];
    while (root) {
        cout << root->val << endl;
        root = root->next;
    }
    return 0;
}

但是,当我运行此代码时,我得到:

0

1个

细分错误:11

我正在使用macintosh,默认为g ++,非常感谢

存储向量元素的地址是不安全的。 更改容器时(例如,通过插入元素),对矢量元素的引用和迭代器将无效。

(您可能在开始之前通过在向量上调用reserve() 使代码正常工作,但是从概念上讲,它还是错误的。大概,向量应该存储指向动态分配的列表节点对象的指针 ,或者其他某种形式的间接寻址(例如,引用到向量和索引)。)

如果没有足够的内存分配,向量将在插入时自动调整大小。 此操作使指向这些元素的指针无效,因为这些元素已被复制/移动到另一个存储位置。

您可以通过使用向量的reserve()方法在插入之前保留一些空间来避免这种情况。

无论如何,您应该想到其他方法来初始化列表。

尽管我误解了您要实现的目标,因为您只能使用STL列表。 您可以通过存储ListNode指针而不是实例来修复代码。 以下代码将使用与您相同的alogrothm正确打印您的列表:

#include <vector>
#include <iostream>

using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

int main() {
int n = 10;
vector<ListNode*> vecListNode;
for (int i = 0; i != n; ++ i) {
    ListNode* pNode = new ListNode(i);
    vecListNode.push_back(pNode);
    if (i) {
        vecListNode[i-1]->next = vecListNode[i];
    }
}
ListNode *root = vecListNode[0];
while (root) {
    cout << root->val << endl;
    root = root->next;
}
return 0;
}

然后,指针就不会无效,因为它们本身存储在向量中。 请注意,上述程序泄漏。 如果考虑使用ListNode,则需要释放该内存。

输出为:[root @ isl1 vectorList]#./a.out

0

1个

2

3

4

5

6

7

8

9

请享用!!!

获取核心转储并使用您选择的调试器对其进行分析。 您可以使用ulimit -c unlimited来获取核心转储,并使用gdb对其进行分析。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM