//...
LPBYTE lpByte = new BYTE[8];
为什么用
delete lpByte;

delete []lpByte;
都能成功运行?
应该用什么?是不是简单数据类型就可以delete和delete[]混用?

解决方案 »

  1.   

    就是不用delete 也会运行成功。但是会用内存泄漏。同样,用delete 而不是delete[] 也会有内存泄漏。这个泄漏如果是少量的,没有任何问题,如果多了会导致系统变慢,死机。您可以让这段代码程序运行1000000次试试。
      

  2.   

    您可以让这段代码程序运行1000000次试试。楼上还真幽默delete只是释放首地址,delete[]释放整个数组空间
      

  3.   

    delete作释放指针用,delete[]作释放数组用
      

  4.   

    我曾经做过这样的测试
    for(int i=0; i<1000; i++)
    {
       BYTE* pBuffer = new BYTE[1024*1024];
       delete pByte;
    }
    并没有发现任何的内存泄漏但是这样用不好,如果是CString* pString = new CString[2];
    你调用delete pString会报错的,所以建议还是养成好习惯用delete[]
      

  5.   

    我用DWORD测试过了 也没错
    void main(void)
    {
      const int max = 100000;
      for (int i=0; i++<ma;)
      {
        DWORD* lpByte = new DWORD[8];
        delete lpByte;
      }
    }
    而且,调试没有发现内存损漏!用F5调试的结果如下:
    Loaded 'ntdll.dll', no matching symbolic information found.
    Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information found.
    Loaded 'C:\WINDOWS\system32\rpcrt4.dll', no matching symbolic information found.
    Loaded 'C:\WINDOWS\system32\advapi32.dll', no matching symbolic information found.
    The thread 0x6B0 has exited with code 100000 (0x186A0).
    The program 'd:\Guest\VCPro\Test\Debug\Test.exe' has exited with code 100000 (0x186A0).线程0x6b0的退出代码会等于max 但是多运行几次后就出现错误max == 1000000的情况下也成功了一次 第二次出错
    看来他的行为似乎是不确定的。
      

  6.   

    对于VC++的编译器是这样的,这是由编译保证的。(可参考MSDN中VC编译器的文档)
    但这于C++语义上是不正确的,并且在其它大多数的编译器上都是有问题的,所以最好不要这样用。
      

  7.   

    不一样的。
    虽然不出错,但
    delete lpByte会造成内存泄漏。
      

  8.   

    真的没有内存泄漏啊!如果有的话,F5运行应该会指示memory leak的
      

  9.   

    对于系统的基本数据类型(整数,字符等)的数组,delete和delete []的效果一样。对自定义结构/类,效果就不一样。