c ++中用new 創建單鏈表時,回圈體中的結點,需不需要delete,為什么資料結構教材(嚴蔚敏)中,在創建單鏈表和插入操作時,用new 生成的結點最后都沒有delete ,是為什么?
用來鏈接結點的p或者s 不是中間量嘛?在函式操作完成(單鏈表建立好或者插入操作完成)后不應該delete 掉這個鏈接結點p 或s 嗎?還是因為什么原因?
求助大佬講解

uj5u.com熱心網友回復:
哪里寫了不需要delete了?你現在貼出來的例子是鏈表的創建和插入,所以沒有節點洗掉,你再繼續往下看看有沒有鏈表洗掉的例子。
delete對應new
free對應malloc
自己申請的記憶體必須自己釋放。
uj5u.com熱心網友回復:
那是必須要delete的。除非你用std::shared_ptr<LNode>。
uj5u.com熱心網友回復:
你找找書上,有沒有清空鏈表的操作吧從鏈表當中摘除節點, 不一定馬上要delete, 因為還會拿來使用其中的資料, 使用完了,也許還會重新利用,改一下數值再掛回去呢; 只有徹底不用了,才需要delete它
清空鏈表就是這種情況
敢于懷疑作者,不盲目相信,是對的
uj5u.com熱心網友回復:
謝謝回答。
我知道不用馬上delete ,但是我有個問題是:
創建鏈表時的頭指標L當然不用馬上delete,因為后面的主函式中還要用,但是在創建鏈表程序中的指標p或者s(這個指標是在創建這個鏈表L程序中連接每個結點時用的),在創建鏈表的函式中,完成鏈表L 的創建后,書上沒有用delete洗掉這個輔助用的指標p 或者s ,我想問的是這個問題,原因是什么?是因為這個指標p 的空間被用了嗎(可是不是只是用它來將每個新結點的資料連接在由頭指標L開辟的空間后面嘛?)
uj5u.com熱心網友回復:
有malloc或者new才有free和delete輔助指標并沒有分配吧, 它只是遍歷鏈表定位要操作的位置的中間變數, 這種中間變數因為沒有new或者malloc給它,自然不需要delete或者free啊
uj5u.com熱心網友回復:
謝謝回答。
這個書上沒有提delete的問題,只是我看書上例子時,沒有delete中間量的指標p 或者s
剛才把這個書上單鏈表的例子都看了一遍,想了一下,創建單鏈表中使用的輔助指標p沒有delete 可能是為了其他函式操作(書上的例子創建單鏈表和使用單鏈表的函式,順序是亂的)也要用一個輔助指標,所以就沒有直接delete, 而其他函式中就直接用了還沒delete 的指標p ,就像一個全域指標,只不過是在某個一定會先使用的函式里申請的,沒delete 誰都可以用。
但是這個書上沒有一個完整的程式例子,所以最后都沒有delete。自己寫的話在主函式里delete 掉嗎?還是不用delete,程式結束就行了
uj5u.com熱心網友回復:
有哎,你看那個圖上面,一個是創建單鏈表(指標p使用了new ),一個是插入操作(指標s 也使用了new)
uj5u.com熱心網友回復:
謝謝回答。
這個是什么意思啊,反正用了new 就一定要delete 嘛
uj5u.com熱心網友回復:
創建和插入的時候, 是要新分配一個節點,然后把這個節點掛到鏈表里面了, 它還要用啊, 所以不能洗掉等這些節點只有從鏈表上摘下來, 不用了才可以洗掉
做某些操作,比如遍歷
這個程序當中會有一些中間變數, 這些中間變數指向現有的的節點的,這種也是不用delete
uj5u.com熱心網友回復:
原來是這樣啊,我以為創建和插入時重新分配的結點,掛到頭指標L 后面后,資料就在L 指標的地址里了,所以覺得那些中間量的指標沒有用了可以delete ,你這樣解釋的那就是我想錯了(雖然不知道為啥這樣)
uj5u.com熱心網友回復:
CreateList_R這個函式里面一個是 L = new Node, 這個是鏈表的頭節點,要一直用
一個是回圈里面的多次 p = new Node; 這里new出來之后,r->next = p; 把它掛在了鏈表上面了, 后面還要繼續用呢, 不能洗掉。
這里面p是臨時變數沒錯, 但是new出來的節點,在r->next = p; 之后, 這個節點就歸鏈表來管理, 和p已經沒什么關系,所以在下次的回圈的時候,p還可以再次 p = new Node
p是臨時變數沒錯, 但是p對應的那個new Node可不是臨時變數, 而是一直要用的資料
uj5u.com熱心網友回復:
你想想,這些中間變數存在于鏈表中(或者說和鏈表中的某個節點一樣指向同一個記憶體地址),釋放它的記憶體就等于釋放鏈表中的某個節點的記憶體。好不容易給節點申請完記憶體并連接到鏈表中,結果卻又被釋放了,這樣還能達到插入節點的效果嗎?uj5u.com熱心網友回復:
你的疑問毫無意義。如果一個物件當它沒有存在的意義的時候,自然要delete ,如果他還有存在的原因。那么不應該deleteuj5u.com熱心網友回復:
節點就是一個個的記憶體塊, 你把它想成火車車廂好了new 和delete 就是生產和銷毀了車廂
Node下面的next才是掛鉤, 勾連下一節車廂
p是臨時的掛鉤, 臨時掛鉤不用了可以扔, 和車廂沒有啥關系, 而Node節點下的next的掛鉤才是關鍵
對與create函式來說,p沒有都可以
for (I=0; I<n; I++) {
r -> next = new Node;
cin >> r -> next -> data;
r->next ->next = NULL;
r = r->next;
};
p無非就是這個r->next寫起來嫌棄長,臨時替換一下,僅此而已
uj5u.com熱心網友回復:
謝謝老板!
uj5u.com熱心網友回復:
嗯嗯謝謝老板
uj5u.com熱心網友回復:
好的,謝謝
uj5u.com熱心網友回復:
智能指標,可以百度一下。
學cpp一定要學stl庫,否則和c沒啥優勢。
uj5u.com熱心網友回復:
既然有create,應該就有delete或者 destroy吧,這些類似的釋放函式里面應該有delete, new delete, malloc free是配對使用的uj5u.com熱心網友回復:
最后在銷毀操作里,free或delete吧uj5u.com熱心網友回復:
你找找書上,有沒有清空鏈表的操作吧
從鏈表當中摘除節點, 不一定馬上要delete, 因為還會拿來使用其中的資料, 使用完了,也許還會重新利用,改一下數值再掛回去呢; 只有徹底不用了,才需要delete它
清空鏈表就是這種情況
敢于懷疑作者,不盲目相信,是對的
謝謝回答。
我知道不用馬上delete ,但是我有個問題是:
創建鏈表時的頭指標L當然不用馬上delete,因為后面的主函式中還要用,但是在創建鏈表程序中的指標p或者s(這個指標是在創建這個鏈表L程序中連接每個結點時用的),在創建鏈表的函式中,完成鏈表L 的創建后,書上沒有用delete洗掉這個輔助用的指標p 或者s ,我想問的是這個問題,原因是什么?是因為這個指標p 的空間被用了嗎(可是不是只是用它來將每個新結點的資料連接在由頭指標L開辟的空間后面嘛?)
指標還需要delete???
uj5u.com熱心網友回復:
你找找書上,有沒有清空鏈表的操作吧
從鏈表當中摘除節點, 不一定馬上要delete, 因為還會拿來使用其中的資料, 使用完了,也許還會重新利用,改一下數值再掛回去呢; 只有徹底不用了,才需要delete它
清空鏈表就是這種情況
敢于懷疑作者,不盲目相信,是對的
謝謝回答。
我知道不用馬上delete ,但是我有個問題是:
創建鏈表時的頭指標L當然不用馬上delete,因為后面的主函式中還要用,但是在創建鏈表程序中的指標p或者s(這個指標是在創建這個鏈表L程序中連接每個結點時用的),在創建鏈表的函式中,完成鏈表L 的創建后,書上沒有用delete洗掉這個輔助用的指標p 或者s ,我想問的是這個問題,原因是什么?是因為這個指標p 的空間被用了嗎(可是不是只是用它來將每個新結點的資料連接在由頭指標L開辟的空間后面嘛?)
p,s是指標,你要知道delete的不是指標本身,delete的是指標指向的結點,指標型別不是動態分配的不需要delete,只有動態分配的才需要手動delete。看來樓主這對指標還是很模糊啊,建議好好翻翻課本
uj5u.com熱心網友回復:
樓主搞暈了吧,中間變數是你的節點啊,你要把他你鏈表不崩了啊,那個指標不用管他啊,你有鏈表頭就能找到所有節點,不會記憶體泄露的啦,最后洗掉的時候再deleteuj5u.com熱心網友回復:
樓主對指標的理解還不到位啊。我們說的delete是釋放指標p所指向的記憶體,那個p所指向的記憶體通過回圈被鏈表中的指標指向了。如果你釋放了p,那么這個鏈表等于白做了uj5u.com熱心網友回復:
一旦用了new創建的記憶體,你在程式結束之前是一定要delete的,要不然會有記憶體泄漏,除非不是用new,用智能指標,這個一定要記住,這個delete不一定要在這段代碼里加上,因為有可能你程式結束前還會用到,只要程式前delete就行uj5u.com熱心網友回復:
沒事清不清都沒事,記憶體泄露又不嚴重轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/118684.html
標籤:C++ 語言
上一篇:devc++,
下一篇:想問問大家有什么好想法
