我已經創建了一個堆棧指針,它被用來創建一個二進制樹。雖然我可以用單個節點填充堆棧,但在嘗試將頂層節點的內存分配給新節點時,我可以創建一個實際的樹,它會發生段錯誤。舉個例子:內存分配(指針和堆棧)
TreeNode *c = new TreeNode;
c = stack.top(); //this segfaults
我不知道如果我誤解是如何工作的,但由於兩者都是同一類型的,應該不是C能夠等於堆棧的頂部?我一直堅持這幾個小時。
我已經創建了一個堆棧指針,它被用來創建一個二進制樹。雖然我可以用單個節點填充堆棧,但在嘗試將頂層節點的內存分配給新節點時,我可以創建一個實際的樹,它會發生段錯誤。舉個例子:內存分配(指針和堆棧)
TreeNode *c = new TreeNode;
c = stack.top(); //this segfaults
我不知道如果我誤解是如何工作的,但由於兩者都是同一類型的,應該不是C能夠等於堆棧的頂部?我一直堅持這幾個小時。
我認爲你誤解了指針在C++/C中是如何工作的。它們只是表示內存地址的整數值。 new
關鍵字爲類分配內存,然後調用該類的構造函數。
所以從你所寫的內容
TreeNode *c = new TreeNode;
分配一個指針的樹節點。然後爲Treenode分配內存,將其稱爲構造函數,並將該內存塊的地址分配給指針。
c = stack.top(); //this segfaults
獲取()由該函數調用返回stack.top地址/指針值並將其分配給變量c。
正如克里斯所說,即使你的代碼已經工作,它是一個泄漏,因爲在C++中沒有垃圾收集器,所以當你執行c = stack.top()時,先前分配的內存只會丟失在堆上。
要麼
Treenode *c = new Treenode;
delete c;
c = stack.top();
或者
Treenode *c = stack.top();
你觀察到的問題是在調用stack.top()的地方。我會建議像這樣的指針教程。
http://www.codeproject.com/Articles/627/A-Beginner-s-Guide-to-Pointers
您剛剛泄露存儲在兩個短行。 – chris
什麼是堆棧的類型,你如何填充它? –
堆棧正在使用類型的模板,並在分配根節點某些數據後通過推送根節點來填充它。如果你想讓我把它放在那裏,我會的。 –