2012-09-25 192 views
-1

我已經創建了一個堆棧指針,它被用來創建一個二進制樹。雖然我可以用單個節點填充堆棧,但在嘗試將頂層節點的內存分配給新節點時,我可以創建一個實際的樹,它會發生段錯誤。舉個例子:內存分配(指針和堆棧)

TreeNode *c = new TreeNode; 
c = stack.top(); //this segfaults 

我不知道如果我誤解是如何工作的,但由於兩者都是同一類型的,應該不是C能夠等於堆棧的頂部?我一直堅持這幾個小時。

+5

您剛剛泄露存儲在兩個短行。 – chris

+0

什麼是堆棧的類型,你如何填充它? –

+0

堆棧正在使用類型的模板,並在分配根節點某些數據後通過推送根節點來填充它。如果你想讓我把它放在那裏,我會的。 –

回答

1

我認爲你誤解了指針在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

+0

啊,這也沒有用,但感謝教程。上帝知道我需要一個。 –

+0

@BrandinJefferson我認爲這個教程可能會幫助很多人。從C-pointers開始就是從任何先前的語言Brandin中轉移出來的,特別是收集到的垃圾。我們都做了這麼久,就像呼吸一樣;自動。需要一些時間。這很值得。 – WhozCraig

+0

問題出在stack.top()上,或者在程序結束時銷燬堆棧,而不是發佈的代碼中。在教程中有一個破解。 – wadge