当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方法,但找不到我的错误。
答案 0 :(得分:0)
在程序结尾处破坏std::unique_ptr
的链会炸毁您的堆栈。您可以通过释放std::unique_ptr
的析构函数中的Queue()
来防止这种连锁反应:
~Queue() {
mHead.release();
}
请注意,Queue
的内存已泄漏。更好的做法是遍历您的节点并逐一释放并销毁它们。