我在程序中new了一个对象数组,然后分别用标题中的两种方法删除。单步跟踪进去,却发现没什么不同。难道二者只是表述的不同,本质是一样的吗?

解决方案 »

  1.   

    char *p;
    (1); p = new char('A');
    delete p
    (2) p = new char[3];
    delete [] p;
      

  2.   

    你只释放了一部分
    你不delete也不会有问题
    只不过内存越来越少
      

  3.   

    两者是不一样的。delete 说明后面删除的指针是个单一对象,
    而delete []说明后面删除的指针是一个对象数组,假如
    string *stringArray = new string[100];
    ...
    delete stringArray
    那么,又stringArray所指的100个string对象中的99个未必能够被适当的删除,因为它们的destrcctors没有被调用。所以正确的做法是:
    如果你在调用new时使用了[],那么必须在delete时也使用[];
    如果你在调用new时没有使用[],那么也不应该在delete时使用[]
      

  4.   

    不对delete只是释放了整个内存,只调用第一个元素的析构函数
    delete [] 会对整个数组的每个元素都调用析构函数的,然后再释放整个内存记住new的时候 如果有[],delete 的时候也要有 []
    这个匹配关系要做好就可以了。
      

  5.   

    理论上讲,delete []比delete会多一个整形字段来记录对象数n,因而delete []会调用n次对象元素的析构函数.
    但实际上在vc6.0和c++Builder5.0中delete []和delete可能具有一样的功能.详见
    http://www.csdn.net/develop/Read_Article.asp?Id=12027
    但还是建议new和delete,new[]和delete[]配对使用!!!!!!!!
      

  6.   

    谢谢诸位高手。
    我把自定义类加上析构函数,用delete执行时立即报错,用delete[]则调用了n次析构,看来只有当存在析构函数时才有不同。