C++11标准的智能指针、野指针、内存泄露的理解(日后还会补充,先浅谈自己的理解)

时间:2021-09-14 02:17:35

1、野指针的概念、成因以及避免

  首先,来说说什么是野指针,所谓野指针就是一个指向未申请访问受限的内存区域或者已经删除了的对象的指针。

什么意思呢?就是本来一个指针指向一个对象、一块内存,但是由于程序(函数)运行结束对象(栈内存)被释放,从而

导致指针指向一个“垃圾”内存,注意,不能将NULL指针认为是野指针。因为野指针指向的是随机的一块内存地址。

成因:1)指针在声明时没有进行初始化;2)在释放指针所指的内存时,没有将指针置为NULL;3)返回值是栈内存的指针或者引用。

避免:很多网上的资料都说初始化指针为NULL,是一个良好的编程习惯,实际上这也是为了避免野指针的出现。当然如果你的指针是

static指针变量,那么它的初始值是不会随机的。

2、内存泄露

  什么是内存泄露呢?所谓内存泄露,就是指动态分配的内存未释放或者无法释放,但是原本指向

这块内存的指针却失去了对这块内存的控制,导致内存的浪费。

成因:1)在使用完内存空间没有将其释放;2)非法访问内存空间,也就是说访问分配的内存中未进行初始化的变量;

避免:额,这个我也不知道具体怎么避免,网上有很多避免内存泄露的方法,这里就不做阐述了。(以后再补充)不过最近在使用集合类的时候出现过内存泄露,

当将其设为静态时,其生命周期与整个程序的生命周期是一样长的,因此容易出现内存泄露。

3、智能指针

  智能指针使用引用计数的计数,也就是说智能指针类使用一个引用计数和类的一个对象关联,由引用计数去跟踪类的多个对象的指针,从而知道有多少个对象的指针指向同一个对象。

它其实是存储指向动态分配对象指针的类

  对于这个智能指针,我还没有进行深入的了解,只是知道在使用一些容易导致内存泄露、出现野指针的情况下,例如最近在写一个语音识别的项目时,使用COM接口指针时,可以使用智能指针。(日后进行深入时再补充)

若要释放一个智能指针,直接给它赋值为NULL即可。