一个有趣的Bug修正记
来源:互联网 发布:深入体验java项目开发 编辑:程序博客网 时间:2024/05/13 05:15
最近无聊写了一个Managed类用来托管指针(C++中)。代码如下:(不存在内存泄露)
这个类有个很严重的问题,就是使用链表的时候。比如有如下的链表定义:
这是一个很一般的链表节点结构。下面,我们使用这个结构:
这个看起来是没什么问题,但是运行的时候有Access Violation。前后加入调试语句之后,发现问题出现在:
p = p->next; (在输出那段里面)
这个有什么问题呢?好像是对象已经被回收了。神奇啊!看看Managed的代码。
在“=运算符”中,有个很大的问题:
问题出现在“this->~Managed();”这里。经过一番思考和画图后,发现p = p->next;的执行方式如下:
p.operator = (p.operator->()->next);
调用operator->没问题。
调用operator=:
调用析构函数
析构对象(p的当前对象)
之前,head=NULL,已经回收了head(head这里是一个无效数据),所以p的引用计数为0,回收p托管的对象。
回收p托管的对象之后,p托管的对象的next的引用计数也变成0,顺便也回收了,就这样,把后面的节点都回收了……
析构完毕
p托管了不可用内存(有的人称为“野指针”“悬空指针”“悬垂指针”)。
结束调用operator=。
然后下一轮循环的时候,就出现了Access Violation。
于是,代码改为使用备份:
至此,问题解决。希望本文能给广大Developer一些Debug的帮助!
by Logic 版权所有,未经许可,不得转载
- 一个有趣的Bug修正记
- 一个有趣的bug
- BugFree 的一个 bug 修正
- 修正o-blog 2.5的一个bug
- 修正TaskManagerEx2.0的一个BUG
- pe_xscan 修正文件时间的一个bug
- U3Terrain的一个BUG及修正
- 发现Ubuntu一个有趣的bug
- 修正bug的方法
- CCEditBox的bug修正
- [置顶] 我修正的 modalbox 的一个bug
- 分享:Microsoft IE Webcontrols Treeview的一个bug及修正
- 今天修正了一个SMD数据库的BUG
- 修正了cgit 项目中makefile的一个Bug
- Linus修正一个内核的mmap data corrupt bug
- 修正了标准工时软件的一个BUG
- 记一次有趣的bug查找
- C++标准库的一个有趣的小bug
- 思考mysql内核之初级系列1--- mysql的启动过程
- PL/SQL执行动态SQL
- 表数据复制和结构复制
- 打字游戏(2)
- 非阻塞模式开发,6K进展
- 一个有趣的Bug修正记
- 编程,难吗?
- 颜色的Pantone编码
- EVC编程知识点2
- log4j.properties详解与例子
- Cisco Creating a RSPAN Session
- 字符编码笔记:ASCII,Unicode和UTF-8
- 7天董事长何伯权创业投资四件事
- Android 之 IntentFilter 详解