常见动态内存错误
编译器不能自动发现动态内存错误,动态内存错误通常只能在程序运行时才能被捕捉到,而且错误原因不容易查找,错误本身也不容易捕捉,改错难度较大。
所以在执行delete之后,通常要将指针变量的值置成NULL,以免对内存空间进行误操作或者无效操作。
下面具体讲讲内存泄漏:
内存泄漏
指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。
内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
下面举几个例子:
1.下面a先是申请了一个int型的动态内存空间,初始化值为12,后面a又申请了一个int型空间,初始化值为34,
则第一次存储12的空间就不会被释放,并且存储12的空间没有被释放,也不能被使用了,造成了内存泄漏。
#include<iostream> using namespace std; int main() { int *a=new int (12); cout<<*a<<endl; //需要 delete a; a=new int (34); cout<<*a<<endl; delete a; system("pause"); return 0; }2.下面的函数,当调用时,会在动态内存中创建一个char型数组,并在桟中生成一个char型指针变量pChar,用pChar指向该数组。
void F(void) { char *pChar=new char [100]; //do something }最好的做法就是:
void F(void) { char *pChar=new char [100]; //do something delete []pChar; }
//F返回一个指针,指向一个动态分配的对象 int *F(T arg) { return new int [arg];//调用者负责释放此内存 }
4.delete只提供了有限的保护
看下面的例子:
执行delete后,相应的指针变量的值未被改变,它依然指向原来的动态内存空间,只是原来动态内存空间的内容已经毫无意义了。
所以在执行delete之后,通常要将指针变量的值置成NULL,以免对内存空间进行误操作或者无效操作。
但是,
int *p=new int (42); auto q=p; delete p; p=NULL;
p和q指向相同的动态分配的对象,我们delete此内存,然后将p置为NULL,指出它不再指向任何对象。但是,重置p对q没有任何作用,在我们释放p所指向的(同时也是q所指向的)内存时,q也变得无效了。在实际系统中,查找指向相同内存的所有指针是异常困难的。
原文地址:http://blog.csdn.net/lanzhihui_10086/article/details/39755027