[问题] 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