簡體   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