[問題] Linked List的delete用法

作者: Ruination   2020-06-05 16:20:13
開發平台(Platform): (Ex: Win10, Linux, ...)
Win10
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
VC++
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
問題(Question):
最近因為在網路上自學課程而接觸C++
上課時跟著老師寫了一個Linked List
但老師因為課程時間的因素沒有把destructor的部分在課堂上寫出來
我試著自己寫了一個destructor
但因為對於指標這部分真的沒有理解透徹
所以不確定這樣是不是正確的
請問我89行開始的destructor有清除到List裡的資料嗎?
或者只是把dn這個Node清除掉而已?
如果沒有清除到List裡的資料
該怎麼寫才能做到?
餵入的資料(Input):
預期的正確結果(Expected Output):
錯誤結果(Wrong Output):
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
https://ideone.com/18SKGh
補充說明(Supplement):
作者: poolongkong (普攏貢)   2020-06-05 17:13:00
94行的 “Node *” 宣告要拿掉89行的dn跟94行的dn不是同一個因為delete在93行 所以delete看到的dn 永遠都是89行的dn寫了一個超簡易的說明範例https://ideone.com/movZ9U
作者: Ruination   2020-06-05 17:35:00
你的意思是說這樣只能delete到first_node而後面的node都delete不到嗎?
作者: poolongkong (普攏貢)   2020-06-05 17:41:00
對的 而且我看編譯的錯誤訊息有說是double free代表你對同一個address delete兩次了
作者: Ruination   2020-06-05 17:45:00
所以只要把94行的Node*拿掉就能確實delete整個List了是嗎?
作者: poolongkong (普攏貢)   2020-06-05 17:51:00
邏輯對了 但執行上還是會有錯誤在進入最後一次的loop iteration中 dn應該是最後一個node 而ndn會是NULL 但是在delete之後 又會將他們分別往後推一格 等於是說 dn等於NULL 而ndn等於NULL的next 這邊就會有問題了
作者: Ruination   2020-06-05 18:04:00
是的 我改完之後丟回VC++執行的確出了錯誤回報 所以改成針對ndn的while迴圈並加了一個ct計算執行次數做確認https://ideone.com/DJsqRp另外想請問有沒有什麼方法能確認自己new出來的記憶體有沒有被確實delete掉?
作者: poolongkong (普攏貢)   2020-06-05 18:09:00
確認的話 應該是可以啦 但好像沒有很簡單的方法 可能要等其他大神補充或是你搜尋一下關於”找出memory leak”的文章
作者: Ruination   2020-06-05 18:11:00
好的 感謝poo大
作者: poolongkong (普攏貢)   2020-06-05 18:15:00
另外就是 目前這樣的寫法其實滿不好的 推薦你試試看把目前的寫法改成List class的destructor不客氣~ 我目前想到一個比較hardcode的確認方法 每次new之後都印出address 每次delete之前也都印出address來比對看看 XD
作者: Ruination   2020-06-05 18:33:00
好的 我再研究看看
作者: james80351   2020-06-05 18:36:00
用valgrind
作者: james732 (好人超)   2020-06-05 19:07:00
linked list強烈搭配IDE的單步執行來練習我第一次玩的時候覺得超感動的 (?)
作者: loveme00835 (髮箍)   2020-06-06 17:31:00
要看你所謂的 "leak" 是要偵測什麼東西, 在用 ctor/dtor 改變物件的 lifetime 以外, 還需要考慮這個物件本身佔據的記憶體是否有被釋放, ctor/dtor 能夠管理的僅僅只有它的 sub-object 可能佔據的記憶體而已,為了讓使用者能更好好地控管所有資源, C++允許你多載new/delete operator, 你可以透過為特定類別多載new/delete 來追蹤物件的使用情形, 就像這個範例一樣https://wandbox.org/permlink/aRJMu6Y4zlQiFZkU因為物件佔據的空間是可以被重複使用的, 所以 ctor/dtor 無法做到更細緻的追蹤, 所以不只是 placementnew, 連 array new 都會需要去多載來獲得所有資訊
作者: flarehunter (Range)   2020-06-07 08:48:00
改用unique_ptr幫你delete,還能讓ownership更清楚https://ideone.com/zIxRvx

Links booklink

Contact Us: admin [ a t ] ucptt.com