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
原创粉丝点击