如果new一个包函0个对象的数据,对于基本数据类型,可以delete[],但对于其它类型,比如说一个类,就出现非法操作,比如:char* ps = new char[0];
delete[] ps;
//OKCDialog* pd = new CDialog[0];
delete[] pd;
//error请问这是C语言规定吗?

解决方案 »

  1.   

    因为delete对象时要调用析构函数。你没有对象,也就没有析构函数所以报错。char这些类型不是对象,所以允许正常。
      

  2.   

    delete要调用析构函数我知道啊,但我的数组里面对象的个数为0,按我的理解,相当于:
    for (int i = 0; i < 0; i++)
    //这里调用析构函数可是析构函数是永远没有机会调用的啊!我认为,要让:
    CDialog* pd = new CDialog[0];
    delete[] pd;
    成功运行,也不难,只是编译器没有去做而已,可能就是个规定而已。
      

  3.   

    CDialog* pd = new CDialog[0];
    相当与
    CDialog* pd = NULL;delete pd;//这里报错
      

  4.   

    CDialog* pd = NULL;delete pd;//这里报错嗯,与这个一样...char *pd = NULLdelete pd;
    //OK
      

  5.   

    to Avoid(千金散尽还复来)
    你试都没试过,还是谨慎点好啊!我在很久以前就知道new一个0元素的数组,不会得到一个空指针的。CDialog* pd = new CDialog[0];
    CString str;
    str.Format("%x", pd);
    AfxMessageBox(str);还有,你按F5,用调试的方法运行,CDialog* pd = new CDialog[0];这行程序还会出现内存泄漏(4字节),这些你试过吗?
      

  6.   

    呵呵,当然不会得到NULL(我说相当于),毕竟是new了。为什么说想当于呢?因为你没有分配任何空间,只是一个指针而已。就像如下:CDialog* pd = new CDialog();delete pd;//delete后pd并不是NULLdelete pd;//报错我这样写,对于一个星星来说应该很明白了吧?
      

  7.   

    CDialog* pd = new CDialog[0];发现分配后的 pd->m_hWnd=0x00000003;不知这个窗口句柄是怎样得到的,可能delete[] pd是释放这个句柄导致出错。
      

  8.   

    我不解的是,delete[] 操作符它是知道数组的元数个数,因为下面的程序可以正常运行:
    CDialog* pd = new CDialog[1];
    delete[] pd;
    很明显,delete[]操作符知道pd里面包函一个CDialog*元素,这样它才能正确的调用CDialog的析构函数。那么:
    CDialog* pd = new CDialog[0];
    delete[] pd;
    无论如何也不应该出错啊!因为这里delete[]操作符也知道pd包函的元素个数(0个),如果按循环的方法来调用数组里面每个元素(CDialog)的析构函数的话,也刚好避过出错的可能,因为它是个空循环啊!
      

  9.   

    http://msdn2.microsoft.com/en-us/library/248aa748(VS.71).aspx自己看吧,delete[]并不是你所认为的for循环。
      

  10.   

    讲了一下自定义new和delete,对我的问题没有什么帮助啊!我想这是个编译原理的问题,所以希望得到一点深入的知识!不管delete[]用不用for,它肯定是知道数组里面有多少个元素的,现在new CDialog[0],那么元素个数就为0,怎么会出错呢!
      

  11.   

    http://msdn2.microsoft.com/en-us/library/t48aek43(VS.71).aspx
    上面这篇文章只是提了一下new一个0大小的数组!
    你看看吧,不是相当与CDialog* pd = NULL;吧?但没有说到如何delete这个0大小的数组!
    找delete相关的文章也没有结果!唉。
      

  12.   

    http://www.ibm.com/developerworks/cn/linux/l-mleak/