我已經編程了大約8個月,所以我對編程頗爲陌生,並且出現在ADT上,包括雙鏈表。免費商店的雙鏈表
我沒有意識到我見過的雙鏈表實現在免費商店中,它們都在堆棧中。如果從列表中刪除特定節點,您可以立即在所述節點上調用delete,而不是等待整個LinkedList結構超出範圍,否則不會讓自由存儲上的每個節點都具有更高的內存效率。
至少如果我的理解正確,只需使用正常的重新鏈接過程從列表中刪除節點實際上並不釋放節點佔用的內存。
我知道免費商店是關聯新關鍵字,哪裏有新的,刪除應該遵循。我瞭解到,您實際上不應該使用原始指針來管理內存,因爲如果您忘記刪除免費商店中的某個項目,則會發生內存泄漏。幸運的是C++ 11引入了智能指針可以解決這個問題,但問題在於,免費商店中鏈接列表結構中的節點的所有者究竟是誰?
在一個非常基本的LinkedList,我們可能對這個
struct Node
{
int _value;
Node * _next = nullptr;
Node * _prev = nullptr;
Node(int value) : _value(value) {}
};
class LinkedList
{
Node * _head = nullptr;
Node * _tail = nullptr;
int _count = 0;
public:
//ctors & dtor
//getters & setters & other methods
};
其中_count是當前存儲在鏈表中元素的個數。考慮到不應該使用原始指針來管理內存,在我看來,我應該將一些原始指針轉移到C++ 11中引入的智能指針。
問題是,1)我真的不知道,誰應該擁有自由商店,即創建的節點。哪些原始指針應該轉換爲智能指針?
2)另一個問題是,將std :: unique_ptr足夠這個實現嗎?即使我使用std :: unique_ptr,一旦我將其從列表中取消鏈接,節點將被刪除嗎?程序如何知道,節點不再使用?
非常感謝您的回覆。
編輯:作爲參考,我加入了兩個方法,構造函數和我實現的插入方法。這就是我的意思是在棧上有一個LinkedList。正如你所看到的,我沒有在我的代碼中使用新的任何地方,然而,鏈接列表的作品。
LinkedList(int value)
{
Node newNode(value);
_head = &newNode;
_tail = &newNode;
_count++;
}
void InsertAtEnd(int value)
{
Node newNode(value);
//tail points to nothing, list is empty
if (_tail == nullptr)
{
_head = &newNode;
_tail = &newNode;
_count++;
}
//list is not empty
else
{
_tail->_next = &newNode;
_tail = &newNode;
_count++;
}
}
「我沒有意識到我看到的雙鏈表實現在免費商店,他們都在堆棧中。」我認爲你是嚴重錯誤的。你能展示任何這樣的實現嗎? – 2015-02-07 18:43:34
通常,容器有一個小的句柄類,它可以從免費商店分配實際數據。句柄類可以在堆棧,另一個容器或免費商店中實例化。 – Galik 2015-02-07 18:45:46
「我瞭解到,您實際上不應該使用原始指針來管理內存」。你不應該寫自己的雙鏈表類(除非它只是一個練習)。標準庫中有一個非常好的例子,如果你看看實現,你可能會發現它使用原始指針。 – 2015-02-07 18:48:45