char *aa;void ddd()

  aa=new char[nLen];  delete[] aa;
}
這個函數會多次調用,有問題嗎?這樣寫有錯嗎?為什么有時候會出錯?

解决方案 »

  1.   

    char *pCh;int nSize=100;
    pCh=new char[nSize];delete[] pCh;
      

  2.   

    如果nLen经过初始化,这些代码没有问题,多次调用也不会有内存泄漏之类的错误。
      

  3.   

    这样的ddd()函数,因为要多次调用,不要将aa放到堆里
      

  4.   

    我想知道 delete[] 可以知道該刪除多少個字節嗎??
      

  5.   

    delete[]可以删除任意多的字节。
    但是他必须是一段连续的内存!
    你想知道删除的大小的话,可以这样的了;
    const int nLen=100;
    int *p=new int[nLen];
    ....................
    cout<<"all in mem<<sizeof(*p)<<endl;
    delete []p;
      

  6.   

    只要你是动态分配的delete[]自然知道该删除多少字节,这你不用担心,你只要保证你的指针安全就可以了
      

  7.   

    如果DELETE后的[]中没有参数,它会释放aa指针所指的全部内存,不管aa 所指的内存是否连续.因为是否连续取决于系统中数据的存储方式和目前可用的连续内存的大小和你要取得的内存大小.
      

  8.   

    哦?
    那如果是這樣呢char *aaa=new char[100];char *bbb=aaa;delete[] bbb;這時會刪掉多少?
      

  9.   

    delete本身没有错,错误在别的地方,可能是中间使用aa过程中越界,或者是不小心删除了几次,或者不小心改变了aa的取值,比如aa++等等;甚至可能是其他部分得代码出错,破坏heap之后导致delete出错。
      

  10.   

    改成这样:char *aa;void ddd()

      aa=new char[nLen];  delete[] aa;
      aa=NULL;
    }以后用aa时判断是否为NULL再使用,要不aa成了野指针!当然会时不时出问题了。delete只是释放aa指向的内容,不删除aa本身!!切记!
      

  11.   

    watch一下。看看new的时候aa的值,确保delete的时候aa的值没有变。
      

  12.   

    qing_li73(bluemoon) ( )说的很有道理