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、运行结果

c++分配内存空间的重复_第1张图片

结构体指针分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++)