为什么将项目添加到链表会导致分段错误?

时间:2019-07-02 03:45:21

标签: c++ linked-list

当numberOfItems设置为10000时,它将起作用。 如果将numberOfItems设置为90000,则会导致分段错误。

#include <iostream>
#include <memory>

template<typename T> class Queue {
public:
struct Node {
std::shared_ptr<T> Data;
std::unique_ptr<Node> Next;
};

Queue() : mHead{new Node}, mTail{mHead.get()} {}

Void push(T dataValue) {
mTail->Data = std::make_shared<T>(std::move(dataValue));
mTail->Next.reset(new Node);
mTail = mTail->Next.get();
}

bool empty() { return mHead.get()==mTail;}

std::unique_ptr<Node> mHead;
Node *mTail;
};

int main() {
Queue<std::string> q;
int numberOfItems{90000};
int i{0};
for(i=0; i<numberOfItems; ++i) {
q.push(std::to_string(i));
}
Queue<std::string>::Node *pointer{ q.mHead.get() };
while(pointer != q.mTail) {
std::cerr << *pointer->data << "\n";
pointer = pointer->Next.get();
}
return 0;
}

在我看来,分段错误发生在Queue类的默认析构函数中。

我尝试检查类成员和push方法,但找不到我的错误。

1 个答案:

答案 0 :(得分:0)

在程序结尾处破坏std::unique_ptr的链会炸毁您的堆栈。您可以通过释放std::unique_ptr的析构函数中的Queue()来防止这种连锁反应:

~Queue() {
    mHead.release();
}

请注意,Queue的内存已泄漏。更好的做法是遍历您的节点并逐一释放并销毁它们。