内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏。
内存泄漏形象的比喻是“操作系统可提供给所有进程的存储空间正在被某个进程榨干”,最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃。所以“内存泄漏”是从操作系统的角度来看的。这里的存储空间并不是指物理内存,而是指虚拟内存大小,这个虚拟内存大小取决于磁盘交换区的设定的大小由程序申请的一块内存,且没有任何一个指针指向它,那么这块内存就泄露了。
如何防止:
1.尽量不去手动分配内存。比如,我一般不使用数组,而使用STL的vector. 2.如果需要手动分配数组,尽量使用STL中的分配方式,或者使用STL和BOOST中的智能指针。 3.某些应用,比如MSXML,尽量使用智能指针。 4.凡是使用new和delete的地方,首先注意指针的初始化,然后要注意new和delete的配对,再就是要注意错误的捕捉。很多时候,内存泄漏不是因为new和delete的配对造成的,而是在自己没有考虑到的可能结果中,程序中断而没有delete手动分配的内存.(智能指针):
shared_ptr的作用有如同
指针,但会记录有多少个
shared_ptrs共同指向一个对象。这便是所谓的
引用计数(reference counting)。一旦最后一个这样的
指针被销毁,也就是一旦某个对象的
引用计数变为0,这个对象会被自动删除。这在非环形数据结构中防止资源泄露很有帮助。
auto_ptr由于它的破坏性复制语义,无法满足标准容器对元素的要求,因而不能放在标准容器中;如果我们希望当容器析构时能自动把它容纳的
指针元素所指的对象删除时,通常采用一些间接的方式来实现,显得比较繁琐。
boost库中提供了一种新型的
智能指针shared_ptr,它解决了在多个指针间共享对象所有权的问题,同时也满足容器对元素的要求,因而可以安全地放入容器中。
通俗来讲,智能指针像是几个人(智能指针)都在使用一间屋子(对象),当所有人都离开屋子(不指向此对象)时,最后一个离开屋子的人负责关灯关门(销毁对象)