参考文档:
http://www.lai18.com/content/2447877.html
https://en.wikipedia.org/wiki/Dangling_pointer
https://zh.wikipedia.org/wiki/%E8%BF%B7%E9%80%94%E6%8C%87%E9%92%88
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
悬挂指针/Dangling Pointers/迷途指针/悬垂指针
野指针/Wild Pointers
悬挂指针是由于:指针的指向内存被删除导致
例子1:
退出if的范围之后,c变量不再存在,p指向的地址被操作系统回收了。
指针被悬挂了,后续如果再被使用就会有问题。
int *p = nullptr; if (p == nullptr) { int c = 100; p = &c; } |
例子2:变量p指向被释放了,指针被悬挂了,后续如果再被使用就会有问题。
int *p = nullptr; { int *q = new int p = q; delete q; } |
野指针多是由于:指针变量未初始化
例如下面的p指针未被初始化,它的指向就可能是随机的,再vs调试状态时,通常会调试器置为0xcccccccc,但再release-非调试状态时,值就不可预期了。
// 不初始化它的指向位置 int *p; |
定位这类问题的时候:
有些时候碰到
1. debug不重现,release重现;
2. debug/release调测状态均不重现,release非调测状态可以重现
3. 优化o2启用重现,优化不启用不重现(发现一例,由虚函数引起)
可以从这几个方面先分析一下。另外定位的时候,添加调测日志的方法/window上OutputdebugStr类似方法都是比较可行的方法。
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)