一、简介
最近写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出新指针的,比较判断数据是否为新的数据的做法坚决不用。