在动态分配内存时候,比如int *p = new int[5];
那么在释放内存时候,我就用delete []p;最近我看到某本书上有下面的这种写法:
int *p = new int[5];
释放内存
p[0] = '\0';
delete p;请问有谁可以解释一下,谢谢。
那么在释放内存时候,我就用delete []p;最近我看到某本书上有下面的这种写法:
int *p = new int[5];
释放内存
p[0] = '\0';
delete p;请问有谁可以解释一下,谢谢。
int *p = new int[5];
delete p;
和
int *p = new int[5];
delete []p;
的执行代码是完全一样的!可能在某些对象的分配上会有些不一样,这个还有待研究!
不过,我建议直接使用delete []p;
前者是delete []p;
后者是p[0]='\0'; delete p;我怎么看不出有什么一样的啊,呵呵。
习惯用 delete []p ;
p[0]='\0'; delete p;却不怎么好理解啊,它怎么也成了释放一块内存的呢?
delete p;
上面也行?——不信!
delete p;时怎么知道p包括多少内在单元?如果delete p;也行,那delete []p;就没有必要存在了,都用delete p;多好,代码多统一!
当然如果某个编程器非常强大,能够对delete p;这样的语句做出判断然后再生成代码的话,楼主所说的也是有可能的,但标准C++是没有这个规定的,只能说那个编译器比较牛,所以建议不要这样用,说不定换个编译器就出错了!
其实第二种方式数据安全性更好,
楼主第二种方式等同于
int *p = new int[5];
delete p;
p = '\0';
目的:不让p成为野指针
现在在讨论delete p;能不能行呢!
就等于
p = NULL;
我只是想给楼主说明问题,如果还有问题参见林锐的高质量c/c++
难道你对delete p;还有怀疑???
p = '0' - 48;吗?感觉有点像别人拿来问我的二级题!
如果一行程序,只要是行就行了,那写法太多了,但我们要写好的程序!
楼上的,看来你对c/c++研究很深入了,连那本书都看过,有时间交流一下!
书上说p = '\0';属于高质量代码了吗?我曾经这样给一字符串赋结束标志:str[10] = 0;
马上被人看得一无事处,还搬出数据结构来吓我。我的观点是这样的,我再发一次:
p[0] = '\0';
delete p;
上面也行?——不信!
delete p;时怎么知道p包括多少内在单元?如果delete p;也行,那delete []p;就没有必要存在了,都用delete p;多好,代码多统一!
当然如果某个编程器非常强大,能够对delete p;这样的语句做出判断然后再生成代码的话,楼主所说的也是有可能的,但标准C++是没有这个规定的,只能说那个编译器比较牛,所以建议不要这样用,说不定换个编译器就出错了!
如果delete掉的指针是struct或class数组,必须用delete []p的形式。
The delete keyword deallocates a block of memory. The argument pointer must point to a block of memory previously allocated by the new operator. If pointer points to an array, place empty brackets before pointer.看来delete数组时都要用 delete []p形式。
你好,我想你是理解错我说的话了,这个程序最好的写法是
int *p = new int[5];
delete p;
p = NULL;
我再强调一遍,我是出于楼主的理解(楼主说的为什么会出现第二种方式)而做出解释的,
这种方式是出于程序安全性准确的是说出于健壮性而考虑的,我并没有说第二种方式的写法
就好,我是说第二种方式的思想比较好你能明白我说的话吗?再补充完整点楼主的第二种方式的目的:
目的:不让p成为野指针,c提高程序的健壮性。//另外,你说的===========================================================================
delete p;时怎么知道p包括多少内在单元?如果delete p;也行,那delete []p;就没有必要存在了,都用delete p;多好,代码多统一!
//=======================================================================================
有两个我想给你强调一下:
(1)指针消亡了,并不表示它所指的内存会自动释放。
(2)内存被释放了,并不表示指针会消亡或者成了NULL指针。
所以楼主的第二种方式目的是解决(2)。但是这种风格不好,最好的方式就是我上面说的那种,
很高兴和你探讨。
int *p = new int[5];
delete []p;
p = NULL;
int *p = new int[5];
delete p;
p = '\0';
目的:不让p成为野指针
----------------------------------
请问p[0]= '\0';等同于p = '\0';吗????
不是吧,zjz800800(万人斩)和yang79tao()------------------------------------
菜鸟,谬言请见谅
delete p;
和
int *p = new int[5];
delete []p;
的执行代码是完全一样的!
---------------
对于内部类型确实没什么区别,
对于自定义的类型,必须用delete []p;建议,对于任何数组,都用delete []p;
--------------------
是的,等同!p就是一个地址(首地址)嘛!也就是p[0]p[0]= '\0';就是让p[0]为结束符,后面的(p[1]....p[n-1])不管了。以后的数据会从p[1]位置开始写入,冲掉你以前的数据,这对于内部类型没关系的,对于自定义类型,不能这么干!!
p=NULL;
以后要用p指针的时候,可以再赋值;
以后没有用p,直接又一次delete []p;也没关系,因为delete一个NULL指针是合法的,它什么也不干!!^_^^_^
p = 0是给指针负值,*p=0,给指针指向的内存值
char *p = new char[8];
*p = 0;
ASSERT(p);
p = 0;
ASSERT(p);//这儿回出错
等同吗?
比如int *p = new int[5];
{
...(p[0]= '\0';等同于p = '\0';)在这个里面等同
}
delete p
{
...(p[0]= '\0';等同于p = '\0';)但是在这里等同吗?,不等同
}
int* p1 = new int;
int* p2 = new int[2];
按正常地释放写法应该是:
delete p1;
delete []p2;
然而这样写也不会违例:
delete []p1;
delete p2;
谁能解释一下吗?本人地意见是:delete 和 delete[]没有社么区别,都是释放一连续分配地控件,只是delete[]在形式上表明p指向的是一个数组
int *p = new int[5];
{
...
}
delete []p;
p = NULL;
言简义概:健壮性也好,也好理解,大家认为呢?
如果new的是结构或类的指针,则必须使用delete []
CObject* p = new CObject[2];
delete p;
delete []p;
的效果是一样的,可以这样试一试:
CObject* p2 = &(p[1]);
delete p;后,再去引用p2会出错,就是说p[0],[1]都被释放了
int *p = new int[5];
delete []p;
p=NULL;最近我看到某本书上有下面的这种写法:
int *p = new int[5];
释放内存
p[0] = '\0'; //写这句没有什么用,写了没影响了,不写更没影响.
delete p; //这里因为p指向的数据是基本类型(int,char,float,..),可以省略[],但是这么用非常不好。建议改为delete []p;
p=NULL;
int *p = new(int);
delete p;
p = NULL;/////////////////////
int *p = new int[5];
delete []p;
p = NULL;