c++分配内存空间的重复
来源:互联网 发布:windows手动更新 编辑:程序博客网 时间:2024/06/11 09:27
一、简介
最近写C++程序时,调试过程中打印了一下QList中使用的指针内存地址,意外发现以前使用的逻辑地址再delete后又被重新使用了,因此总是使用char *address1 = new char;char *address2 = new char;if (address1 != address2) {}来进行指针的比较,如果他们顺序执行没什么问题,地址肯定不同。但如果new address1时,被他人调用char *p = address1,然后delete p;p=NULL,接着new address2就危险了,这时可能address1 == address2了。所以写下文章以给自己一个警告(也主要是指针管理不严,自己new的东西绝对不能让别人delete)。
二、详解
1、测试程序
在qt4环境下运行:
struct Source { char *p; int num;};int mian(){ Source *point; QList<Source *>list; for (int index = 0; index < 5; index++) { qDebug() << "------------------"; for(int i = 0; i < 5; i++) { point = new Source; list.append(point); qDebug() << "point=" << point; } for(int i = 0; i < 5; i++) { delete list[i]; list[i] = NULL; } list.clear(); } return 0;}
2、运行结果
结构体指针分5组(每组先new后delete):发现每组point0-point4肯定逻辑地址不同,但5组中有逻辑地址被重复使用,比如
0x12b5950在每组中都能涉及到。
Source *point; QList<Source *>list; point = new Source; qDebug() << "point=" << point; delete point; point = NULL; point = new Source; qDebug() << "point=" << point; delete point; point = NULL;point= 0xe6c210
point= 0xe6c210
运行前后指针地址就也许相同了。三、总结
(1)经过分析,在C++程序中使用QMap或map将结构体指针作为key值(QMap<Source*,QString>map)的做法还是需要注意的。
(2)特别是每次保留上一次的指针(该指针可能被别人delete直至赋为NULL,但自己没清空),然后new出新指针的,比较判断数据是否为新的数据的做法坚决不用。
0 0
- c++分配内存空间的重复
- c++分配内存空间的重复
- C/C++内存空间的分配
- C的编译器对内存空间的分配
- C/C++分配内存空间
- C++new分配内存空间
- C分配内存空间
- 程序内存空间的分配
- Linux内存空间的分配
- 【转】c语言动态与静态分配内存空间的区别
- c语言动态与静态分配内存空间的区别
- 内存空间的回收和分配
- Android应用分配的内存空间
- Java内存空间的分配、回收
- 分配内存空间
- 分配内存空间
- 分配内存空间
- java 变量 分配内存空间的一道题
- C++ 结构体(三)
- 浅谈CSS的伪类与伪元素
- 3_1_奇偶个数
- 阻塞队列(BlockingQueue)
- uva1493 - Draw a Mess 并查集路径压缩
- c++分配内存空间的重复
- 3_2_数字特征值
- protected修饰符总结
- hdu 4276 The Ghost Blows Light(Spfa+树形dp)
- Servlet 3.0 新特性详解(转载)
- 图像处理过程中的一些预处理方法
- UIListViewTest
- 比起主流的30秒,10秒广告能获得2倍的效果
- IE6、 IE7、IE8、IE9、Firefox兼容性问题