http://wenku.baidu.com/view/0e3d8c1cfc4ffe473368ab5c.html###
1:首先来说一个大家容易忽略的问题:
定义:int *p=new int; 这个大家一看就知道,在内存中分配了一个int类型的空间,
没错。但是我想说的是,操作系统在堆在分配了一个int类型空间给p指向的空间,但是p
本身的值是在栈上,我觉的明白这个很重要。比如,你需要
处理一个海量数据,这个数据需要用二维数组来表示,你如果这样定义
int *ptr[MaxNum],然后再循环为每个ptr[0~MaxNum-1]分配空间,
这个时候容易隐含一个错误,
我们知道内存中栈的大小大约就2M左右,
而堆很大,几乎没有限制,当你的MaxNum
很大的时候,就会导致内存溢出,因为
ptr这个值的本身是在栈上的,而栈的大小就2M
左右,而你又有这么多个地址要存放,所以会出错。解决办法有二个:一:用
一维数据代替二维数组;二:定义一个二维指针; 然后再动态分配。
②
int *p=new int[3];
*p=1;
p++;//p的指向改变了,指向了下一空间
*p=2;
delete []p;
大家能发现这段代码有什么问题吗?
错误还是发生在delete[]p
,c/c++规定,当删除一个指针时,这个指针应指向其首地址,而上面的代码中p
值已经发生了变化,所以会发生错误,如何避免呢?可以备份一份;如
int * pbak=p;在释放的时候,用delete[]pbak即可。
④
int a=100;
itn *p=&a;
delete p;
看到了这里,如果你还不能看出这段代码的错误,那你前面的白看了,说明你还是没有真正懂得啊!
错误还是发生在delete p,什么原因?因为p并没有通过new获得内存空间,只是指向某个变量,而delete p是强行释放a的空间,肯定发生错误啦。
3.
delete与delete[]的区别我们首先要知道当delete的时候,系统会自动调用已分配的对象的析构函数。
那么当我们用new[]分配的对象是基本数据类型的时候,用delete和delete[]没什么区别,都可以。但是当用new[]分配的对象是自定义类型的时候,必须要用delete[],这样它才会调用每个对象的析构函数,除非你的析构函数没有做任何事。
总结一句话:使用new 得来的空间,用delete 来释放;使用new []
得来的空间,必须用delete [] 来释放。这样肯定不会错。