本文主要是介绍c++分配内存空间的重复,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、简介
最近写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出新指针的,比较判断数据是否为新的数据的做法坚决不用。
这篇关于c++分配内存空间的重复的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!