打赏
禅在心中
东风夜放花千树,更吹落、星如雨。宝马雕车香满路。凤箫声动,玉壶光转,一夜鱼龙舞。 蛾儿雪柳黄金缕,笑语盈盈暗香去。众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。

一、动态内存管理

  通常我们创建动态内存的时候,需要自己管理好内存,也就是说,new出来的对象一定要注意释放掉。下面通过例子可以看到这个问题所在:

struct BBE{
    int X;
    int Y;
    void show()
    {
        qDebug()<<X<<'\t'<<Y<<endl;
    }
};

void test()
{
    BBE *n = new BBE;
    n->X = 10;
    n->Y = 20;
    n->show();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    test();
    return a.exec();
}

  我们通过Qt中的Clang Static Analyzer的源码分析工具,可以检测到内存问题:

  因此,对应的new 出来的动态内存要注意释放掉,

void test()
{
    BBE *n = new BBE;
    n->X = 10;
    n->Y = 20;
    n->show();
    delete n;
    n = NULL;
}

  如上即可,释放掉内存的指针习惯指向NULL,防止出现悬空指针

二、野指针与悬空指针

  A pointer in c which has not been initialized is known as wild pointer.  ---- 野指针

  If a pointer still references the original memory after it has been freed, it is called a dangling pointer.  ---- 悬空指针

三、智能指针

  本文以Qt中提供的智能指针为例,首先,智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象的指针指向同一对象。通过这一方法实现对内存的管理功能。

  在上面的例子中,可以改为代码:

void test()
{
    QSharedPointer<BBE> n(new BBE);
    n->X = 10;
    n->Y = 20;
    n->show();
}

  可以看到,使用智能指针的话,不需要手动delete内存了。

 

posted on 2018-07-24 00:27  禅在心中  阅读(456)  评论(0编辑  收藏  举报