在动态分配内存时候,比如int *p = new int[5];
那么在释放内存时候,我就用delete []p;最近我看到某本书上有下面的这种写法:
int *p = new int[5];
释放内存
p[0] = '\0';
delete p;请问有谁可以解释一下,谢谢。

解决方案 »

  1.   

    从编译的结果来看,
    int *p = new int[5];
    delete p;

    int *p = new int[5];
    delete []p;
    的执行代码是完全一样的!可能在某些对象的分配上会有些不一样,这个还有待研究!
      

  2.   

    应该有不同,建议不要用delete p;
      

  3.   

    没有什么差别,用p[0] = '\0';是把申请的空间里的数据先清空,再delete掉。
    不过,我建议直接使用delete []p;
      

  4.   

    请说明为什么一样。
    前者是delete []p;
    后者是p[0]='\0'; delete p;我怎么看不出有什么一样的啊,呵呵。
      

  5.   

    p[0]  = '\0' 指针设为空指针,p[0] = NULL ;
    习惯用 delete []p ;
      

  6.   

    delete []p;这个好理解,是释放一块内存
    p[0]='\0'; delete p;却不怎么好理解啊,它怎么也成了释放一块内存的呢?
      

  7.   

    p[0] = '\0';
    delete p;
    上面也行?——不信!
    delete p;时怎么知道p包括多少内在单元?如果delete p;也行,那delete []p;就没有必要存在了,都用delete p;多好,代码多统一!
    当然如果某个编程器非常强大,能够对delete p;这样的语句做出判断然后再生成代码的话,楼主所说的也是有可能的,但标准C++是没有这个规定的,只能说那个编译器比较牛,所以建议不要这样用,说不定换个编译器就出错了!
      

  8.   

    这两种方式肯定不一样,第一种就不说了
    其实第二种方式数据安全性更好,
    楼主第二种方式等同于
    int *p = new int[5];
    delete p;
    p = '\0';
    目的:不让p成为野指针
      

  9.   

    不让成为野指针只是这一句:p = '\0';而且非常不专业,应该是这样:p = NULL;
    现在在讨论delete p;能不能行呢!
      

  10.   

    p = '\0';
    就等于
    p = NULL;
    我只是想给楼主说明问题,如果还有问题参见林锐的高质量c/c++
      

  11.   

    to yang79tao():
    难道你对delete p;还有怀疑???
      

  12.   

    我说的是不专业,你见过这样给指针赋0的吗?
    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++是没有这个规定的,只能说那个编译器比较牛,所以建议不要这样用,说不定换个编译器就出错了!
      

  13.   

    以上只对zjz800800(万人斩)说,其它人不用看。
      

  14.   

    如果delete掉的指针是简单类型,如:char、int等,delete p与delete []p效果相同;
    如果delete掉的指针是struct或class数组,必须用delete []p的形式。
      

  15.   

    MSDN上这么说:
    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形式。
      

  16.   

    to yang79tao():
    你好,我想你是理解错我说的话了,这个程序最好的写法是
    int *p = new int[5];
    delete p;
    p = NULL;
    我再强调一遍,我是出于楼主的理解(楼主说的为什么会出现第二种方式)而做出解释的,
    这种方式是出于程序安全性准确的是说出于健壮性而考虑的,我并没有说第二种方式的写法
    就好,我是说第二种方式的思想比较好你能明白我说的话吗?再补充完整点楼主的第二种方式的目的:
    目的:不让p成为野指针,c提高程序的健壮性。//另外,你说的===========================================================================
    delete p;时怎么知道p包括多少内在单元?如果delete p;也行,那delete []p;就没有必要存在了,都用delete p;多好,代码多统一!
    //=======================================================================================
    有两个我想给你强调一下:
    (1)指针消亡了,并不表示它所指的内存会自动释放。
    (2)内存被释放了,并不表示指针会消亡或者成了NULL指针。
    所以楼主的第二种方式目的是解决(2)。但是这种风格不好,最好的方式就是我上面说的那种,
    很高兴和你探讨。
      

  17.   

    笔误:
    int *p = new int[5];
    delete []p;
    p = NULL;
      

  18.   

    楼主第二种方式等同于
    int *p = new int[5];
    delete p;
    p = '\0';
    目的:不让p成为野指针
    ----------------------------------
    请问p[0]= '\0';等同于p = '\0';吗????
    不是吧,zjz800800(万人斩)和yang79tao()------------------------------------
    菜鸟,谬言请见谅
      

  19.   

    int *p = new int[5];
    delete p;

    int *p = new int[5];
    delete []p;
    的执行代码是完全一样的!
    ---------------
    对于内部类型确实没什么区别,
    对于自定义的类型,必须用delete []p;建议,对于任何数组,都用delete []p;
      

  20.   

    请问p[0]= '\0';等同于p = '\0';吗????
    --------------------
    是的,等同!p就是一个地址(首地址)嘛!也就是p[0]p[0]= '\0';就是让p[0]为结束符,后面的(p[1]....p[n-1])不管了。以后的数据会从p[1]位置开始写入,冲掉你以前的数据,这对于内部类型没关系的,对于自定义类型,不能这么干!!
      

  21.   

    哎呀,这么麻烦,不如对于任何类型都用delete []p;
    p=NULL;
    以后要用p指针的时候,可以再赋值;
    以后没有用p,直接又一次delete []p;也没关系,因为delete一个NULL指针是合法的,它什么也不干!!^_^^_^
      

  22.   

    zxs790501(沧海一粟) 你的说法不对,p[0] = 0 与 *p = 0相同,与p = 0绝对不同
    p = 0是给指针负值,*p=0,给指针指向的内存值
    char *p = new char[8];
    *p = 0;
    ASSERT(p);
    p = 0;
    ASSERT(p);//这儿回出错
      

  23.   

    to zxs790501
    等同吗?
    比如int *p = new int[5];
    {
       ...(p[0]= '\0';等同于p = '\0';)在这个里面等同
    }
    delete p
    {
    ...(p[0]= '\0';等同于p = '\0';)但是在这里等同吗?,不等同
    }
      

  24.   

    大家不要争了,请看下面地例子:
    int* p1 = new int;
    int* p2 = new int[2];
    按正常地释放写法应该是:
    delete p1;
    delete []p2;
    然而这样写也不会违例:
    delete []p1;
    delete p2;
    谁能解释一下吗?本人地意见是:delete 和 delete[]没有社么区别,都是释放一连续分配地控件,只是delete[]在形式上表明p指向的是一个数组
      

  25.   

    综上所述本人认为:
    int *p = new int[5];
    {
    ...
    }
    delete []p;
    p = NULL;
    言简义概:健壮性也好,也好理解,大家认为呢?
      

  26.   

    如果new的是基本数据类型,delete 和delete []效果一样
    如果new的是结构或类的指针,则必须使用delete []
      

  27.   

    不同意楼上的说法:
    CObject* p = new CObject[2];
    delete p;
    delete []p;
    的效果是一样的,可以这样试一试:
    CObject* p2 = &(p[1]);
    delete p;后,再去引用p2会出错,就是说p[0],[1]都被释放了
      

  28.   

    正常用法
    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;
      

  29.   

    我看到的资料是对于delete p 和delete[] p不同的编译器解释不一样。
      

  30.   

    一般地:
    int *p  = new(int);
    delete p;
    p = NULL;/////////////////////
    int *p = new int[5];
    delete []p;
    p = NULL;