一、动态内存管理
通常我们创建动态内存的时候,需要自己管理好内存,也就是说,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内存了。
作者:禅在心中
出处:http://www.cnblogs.com/pinking/
本文版权归作者和博客园共有,欢迎批评指正及转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。