作者Ruination (没长角的羊)
看板C_and_CPP
标题[问题] Linked List的delete用法
时间Fri Jun 5 16:20:13 2020
开发平台(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):
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.228.108.127 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1591345219.A.2FF.html
1F:推 poolongkong: 94行的 “Node *” 宣告要拿掉 06/05 17:13
2F:推 poolongkong: 89行的dn跟94行的dn不是同一个 06/05 17:18
3F:→ poolongkong: 因为delete在93行 所以delete看到的dn 永远都是89行 06/05 17:20
4F:→ poolongkong: 的dn 06/05 17:20
5F:推 poolongkong: 写了一个超简易的说明范例 06/05 17:34
7F:→ Ruination: 你的意思是说这样只能delete到first_node而後面的node 06/05 17:35
8F:→ Ruination: 都delete不到吗? 06/05 17:35
9F:推 poolongkong: 对的 而且我看编译的错误讯息有说是double free 06/05 17:41
10F:→ poolongkong: 代表你对同一个address delete两次了 06/05 17:42
11F:→ Ruination: 所以只要把94行的Node*拿掉就能确实delete整个List了 06/05 17:45
12F:→ Ruination: 是吗? 06/05 17:45
13F:推 poolongkong: 逻辑对了 但执行上还是会有错误 06/05 17:51
14F:→ poolongkong: 在进入最後一次的loop iteration中 dn应该是最後一 06/05 17:54
15F:→ poolongkong: 个node 而ndn会是NULL 但是在delete之後 又会将他们 06/05 17:54
16F:→ poolongkong: 分别往後推一格 等於是说 dn等於NULL 而ndn等於NULL 06/05 17:54
17F:→ poolongkong: 的next 这边就会有问题了 06/05 17:54
18F:→ Ruination: 是的 我改完之後丢回VC++执行的确出了错误回报 所以改 06/05 18:04
19F:→ Ruination: 成针对ndn的while回圈并加了一个ct计算执行次数做确认 06/05 18:04
21F:→ Ruination: 另外想请问有没有什麽方法能确认自己new出来的记忆体 06/05 18:04
22F:→ Ruination: 有没有被确实delete掉? 06/05 18:04
23F:→ poolongkong: 确认的话 应该是可以啦 但好像没有很简单的方法 可 06/05 18:09
24F:→ poolongkong: 能要等其他大神补充 06/05 18:09
25F:→ poolongkong: 或是你搜寻一下关於”找出memory leak”的文章 06/05 18:10
26F:→ Ruination: 好的 感谢poo大 06/05 18:11
27F:→ poolongkong: 另外就是 目前这样的写法其实满不好的 推荐你试试看 06/05 18:15
28F:→ poolongkong: 把目前的写法改成List class的destructor 06/05 18:15
29F:→ poolongkong: 不客气~ 我目前想到一个比较hardcode的确认方法 每 06/05 18:17
30F:→ poolongkong: 次new之後都印出address 每次delete之前也都印出add 06/05 18:17
31F:→ poolongkong: ress来比对看看 XD 06/05 18:17
32F:→ Ruination: 好的 我再研究看看 06/05 18:33
33F:推 james80351: 用valgrind 06/05 18:36
34F:→ james732: linked list强烈搭配IDE的单步执行来练习 06/05 19:07
35F:→ james732: 我第一次玩的时候觉得超感动的 (?) 06/05 19:07
36F:→ loveme00835: 要看你所谓的 "leak" 是要侦测什麽东西, 在用 ctor/ 06/06 17:31
37F:→ loveme00835: dtor 改变物件的 lifetime 以外, 还需要考虑这个物件 06/06 17:32
38F:→ loveme00835: 本身占据的记忆体是否有被释放, ctor/dtor 能够管理 06/06 17:32
39F:→ loveme00835: 的仅仅只有它的 sub-object 可能占据的记忆体而已, 06/06 17:33
40F:→ loveme00835: 为了让使用者能更好好地控管所有资源, C++允许你多载 06/06 17:34
41F:→ loveme00835: new/delete operator, 你可以透过为特定类别多载 06/06 17:35
42F:→ loveme00835: new/delete 来追踪物件的使用情形, 就像这个范例一样 06/06 17:36
44F:→ loveme00835: 因为物件占据的空间是可以被重复使用的, 所以 ctor 06/06 17:37
45F:→ loveme00835: /dtor 无法做到更细致的追踪, 所以不只是 placement 06/06 17:38
46F:→ loveme00835: new, 连 array new 都会需要去多载来获得所有资讯 06/06 17:39
47F:推 flarehunter: 改用unique_ptr帮你delete,还能让ownership更清楚 06/07 08:48