我是一個SWE學習C++,並使用std ::的unique_ptr爲head
和next
引用建立一個簡單的LinkedList類。這是基本結構:C++ smart_ptr不會導致堆棧溢出?
template <class T>
struct LinkedListNode {
T value;
std::unique_ptr<LinkedListNode<T>> next;
// For debugging.
~LinkedListNode() {
std::cout << "destructed for value " << this->value << std::endl;
}
};
template <class T>
struct LinkedList {
std::unique_ptr<LinkedListNode<T>> head;
};
使用智能指針,我想到的是,當一個LinkedList實例被刪除或超出範圍,則head
將被刪除,並且每個next
節點將遞歸也被刪除。
而這正是發生了什麼。但是,當處理真正的長列表(~20M節點)時,它仍然可以正常工作。不應該因堆棧溢出而崩潰嗎?
爲了非常粗略估計我的操作系統堆棧的大小,我寫了下面的腳本:
int main() {
struct s {
static void p(int i) {
std::cout << i << std::endl;
p(i+1);
};
s::p(0);
}
而且它的迭代次數墜毀〜175K,比我能到20M節點要少得多之前解除分配。到底是怎麼回事?我是否錯過了unique_ptr的工作方式?
這看起來不像'std :: unique_ptr'的智能用法。持有'unique_ptr'意味着擁有對象的所有權。在鏈接列表中,節點不擁有下一個節點的所有權,它擁有本身包含的數據的所有權。 – Jack
您可以發佈您正在討論的整個代碼,以便其他人可以編譯並查看會發生什麼嗎? – Ruslan
當然! https://gist.github.com/manuelmenzella/0fd85280d5051abec2c7 不要太苛刻;) –