最近在阅读别人的代码:
在一个自定义类中,这样定义了一个 指针类型成员数据:
BYTE*  m_pComBuffer;
在构造函数中,初始化为:
mpComBuffer= new BYTE[1024]
在析构函数中,释放空间
delete[] m_pComBuffer;
想请问哪位老师,
1.这样用有什么好处,是否能够有效的节约内存资源,是否因为它是动态分配内存空间。
2.delete[]表示了什么,如果去掉"[]",build也会通过,但是有没有错呢?谢谢您的指导。

解决方案 »

  1.   

    delete[] mpComBuffer释放mpComBuffer所指向的整个缓冲区
    delete mpComBuffer只释放mpComBuffer指针本身所占用的缓冲区
      

  2.   

    1.这样用很灵活,因为有些地方需要到声明的后面才知道需要分配多少内存。
    2.[]是必须的,这样才能释放所有分配给m_pComBuffer的内存;如果是这样:
      delete m_pComBuffer;
      那只能释放掉pComBuffer数组的第一个字节的内存,造成内存泄漏
    3.最好后面再加上一句:pComBuffer = NULL;
      这样pComBuffer就不会成为野指针
      

  3.   

    3.最好后面再加上一句:pComBuffer = NULL;
      这样pComBuffer就不会成为野指针指针是类成员,析构函数执行完成后便灰飞烟灭了,何来野指针?
    char * m_pComBuffer = new BTYE[1024];的好处就是,在你的类中经常需要动态的分配较大的内存空间,效率当然会降低了,所以预先开辟一片内存缓冲区,给所有的类成员函数使用!
    但最好不要使用这种'无谓'的动态类型,因为大多情况下,你将需要重载该类的赋值运算符及复制构造函数
      

  4.   

    楼上的,你好!
    请问在对象没有析构之前,如果你在delete []m_pComBuffer之后,因为某些原因忘了该指针指向的内存已经释放,而继续使用该变量,会出现什么结果呢?一般的情况是先判断一下该变量是否为空:if (!pComBuffer){},可想而知,这时候会出现什么结果!
      

  5.   

    不存在也指针的问题,他是析够函数!不用数组用指针差不多对于你这个程序来说!分配内存空间特别大推荐用指针.delete 删除一个空间
    delete[] 删除所有的分配空间
      

  6.   

    delete[]和delete对于简单数据类型没有区别;对于类就有区别,因为delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。因此,分配内存和释放内存的时候,如果用了new TYPE[]来释放,最好用delete[]来释放,这是一个良好的习惯。
      

  7.   

    就以上各贴看来,仅Mackz是“基础扎实的老师”。
      

  8.   

    Mackz真是一针见血,“扎实”
      

  9.   

    delete[]和delete对于简单数据类型没有区别;对于类就有区别,因为delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。因此,分配内存和释放内存的时候,如果用了new TYPE[]来释放,最好用delete[]来释放,这是一个良好的习惯。=====错了吧? 是有区别的!
    而且既然delete[] 是删除所有的分配空间,那么自然调用所有对象的析构函数^_^
      

  10.   

    对于mpComBuffer= new BYTE[1024]; 来说无论是 delete mpComBuffer; 还是delete []mpComBuffer;都是释放所有的申请空间,没有什么"delete 删除一个空间 delete[] 删除所有的分配空间"这种说法.MackZ说"delete[]和delete对于简单数据类型没有区别",是因为简单数据(或应说内部型数据,build-in date type)是没有析构的,所以没有问题. 如果是用户定义类型(也就是类),如果它的析构函数没有什么特别之处,这两种写法在实际情况下也是没有什么区别,但是如果析构函数中有诸如:
     if(m_pAnotherObject)
      {  
         delete m_pAnotherObject;
         m_pAnotherObject=NULL;
      }
    或其它类似的语句, delete mpComBuffer; 还是delete []mpComBuffer就有极大的区别了.
      

  11.   

    C++ Primer中有这样的描述:
    看过前面的delete表达式,你可能会问,如果pi因为某种原因被设置为0又会怎么样呢?代码不应该像这样吗?
    // 这样做有必要吗?
    if ( pi != 0 )
    delete pi;
    答案是不。如果指针操作数被设置为0,则C++会保证delete表达式不会调用操作符delete()。
      

  12.   

    在析构函数中,释放空间为安全期间最好是
    if(m_pComBuffer!=NULL)
    {
       delete[] m_pComBuffer;//delete m_pComBuffer[]也可以
       m_pComBuffer=NULL;
    }
      

  13.   

    我认为delete[]和delete只有在动态申请一个对象空间时才没有区别,其他的时候都是不同的。
    int *p = new int[1];
    //
    这时释放p用delete[]p和delete p都一样。如果对象不止一个,就必须以数组形式与之对应
      

  14.   

    楼主,你的认识可能是错误的。
    因为刚刚laiyiling兄的回复跟上面还是不一样的。
    你究竟信谁?我一直以为的也正如上面陈述的:
    “delete 删除一个空间
      delete[] 删除所有的分配空间”但从诸位牛牛的回复中思考了一下,又去做了个小试验
    发现问题严重了。
    这跟课本上讲的、跟我一直认为的都有所不同了!!
    正在试验中……