typedef struct CBinfo
{
  char           name[14];
  long  ID;
  int  DB_DH;
 }CBINFORMATION;
class CCBLINKApp : public CWinApp
{
   ......
CBINFORMATION* m_cbIn;
   ......
}
   ......
CCBLINKApp::CCBLINKApp()
{
  ......
m_cbIn=NULL;
  ......
}BOOL CCBLINKApp::GetParaFunc(CString PathName)

    
  if (m_cbIn!=NULL)
{
delete[] m_cbIn;
m_cbIn=NULL;
         }
         .........
         m_cbIn=new CBINFORMATION [nCount];
         ..........

}
为什么程序一运行到 GetParaFunc(CString PathName)中delete[] m_cbIn时出错?
提示      "Debug Error!
           DAMAGE: after Normal block(#117) at 0x00378f98."
我的原意是:因为程序中多次运行GetParaFunc(CString PathName),需每次动态调整m_cbIn数组大小,重新分配内存地址,防止每次运行到GetParaFunc(CString PathName)时,多次分配m_cbIn数组内存,造成内存资源消耗太多.
请各位大侠指点!

解决方案 »

  1.   

    在你delete[] m_cbIn後你检查一下m_cbIn,他还是不为NULL的,虽然他所占的空间被释放,但他不为空,所以出错,你在删除是做个简单的赋值
    m_cbIn = 0即可
      

  2.   

    你申明为CBINFORMATION* m_cbIn;用delete[] m_cbIn;当然回出错了.用delete m_cbIn;
    delete[] m_cbIn是删除一个指针数组
      

  3.   

    同意 lizmei001(暗黑) 的。 
      

  4.   

    直接删除m_cbin,
    delete m_cbin;
    如果想删除分配的空间,最好使用malloc与free函数进行。
      

  5.   

    我认为错误不在delete [] m_cbIn这儿,并且这一句不能改为delete m_cbIn。我猜想你的错误可能是:因为你没有保存每次分配的结构的个数,所以使用的时候可能会导致内存越界,是系统保存的关于m_cbIn的长度信息被破坏,这样在delete的时候就会出错。建议你查查程序的别的地方。
      

  6.   

    这几行代码本身没有任何问题的,而且也只能用delete[],用法也没有任何错!对此有疑问的可以去看一下Effective C++,阿笨猫的猜想也不成立,不过它的建议却没有错,查一查程序别的地方!
      

  7.   

    同意 leeseon() 的说法。前面几位难道没看到人家是
    m_cbIn=new CBINFORMATION [nCount];吗?删除的时候还能delete m_cbIn这样啊?就你所写的,我看没有错误!你应该看看别的地方是不是改了什么东西。
      

  8.   

    我也遇到过.我直接把delete[]注释掉了,呵呵
    关注.
      

  9.   

    你犯了两个错误:
        一:你申明为CBINFORMATION* m_cbIn;
            用delete[] m_cbIn;当然回出错了.应当使用delete m_cbIn;
        二:指针虽然被你delete掉了,但是,它的值还不是NULL,应加上一句:
            m_cbIn=NULL;
    然后一切OK了。
      

  10.   

    就你所写的,我看没有错误!前面几位说什么“用delete m_cbIn”之类的人C++肯定没入门啦,我猜问题可能在别的地方,比如说你在别的地方用了delete[]m_cbIn而忘了m_cbIn=NULL,这时候你new出来的空间已经释放,但m_cbIn并不为NULL,建议你不要用系统的delete,自己写一个类似这样的:
    void mydelete(CBINFORMATION* p){
    delete []p;
    p=0;
    }
    就能防止此类事情的发生。
      

  11.   

    同意 Aspist(边城浪子)
    就你所写的,我看没有错误!前面几位说什么“用delete m_cbIn”之类的人C++肯定没入门啦,
    你在别的地方用了delete[]m_cbIn而忘了m_cbIn=NULL是一种可能;
    也可能你开始new 了10个;后来new了1 个,m_cbIn可能在程序的另一个地方不小心地指向了new 一个的地址;
    有一点可能肯定,你的错误不在你贴出来的代码中
      

  12.   

    可能是数组访问越界了.先简单的把
    m_cbIn=new CBINFORMATION [nCount];
    改成
    m_cbIn=new CBINFORMATION [nCount+10];
    试试,如果问题解决了,那么一定是你数组访问越界了,然后进一步确定哪里出了什么问题.
    typedef struct CBinfo
    {
      char           name[14];
      long  ID;
      int  DB_DH;
     }CBINFORMATION;
    在这个结构里面也有一个数组,是不是这个数组使用的时候访问越界等等.
    还有,贴出一些其他代码吧,我想仅仅就你现在贴出的代码来看是没有问题的.
      

  13.   

    同意 liu_feng_fly(谁动了我的~~~~~~~~工资)
      

  14.   

    第一次运行的时候你没有分配活动内存,应用delete m_cbIn;
      

  15.   

    你跟踪一下m_cbIn看看,delete的时候是不是和new的时候不一样了?
    嘿嘿,不用我说你也知道问题在哪儿了吧.
      

  16.   

    感谢各位的热情指点,由于出差,昨天才回来,一直托到现在才响应各位,抱歉!
       我在后来查明了原因:并不是因为new  delete 操作符使用的语法不对.
    而是数组越界的问题.我在程序中new 了nCount 个 CBinfo结构类型变量,赋值的时候却使用了 nCount+1个,数组访问越界了.delete时当然出错了!
       凡是说数组越界的朋友答对了.特别是 liu_feng_fly(谁动了我的~~~~~~~~~~~~~~工资),和我后来查出问题的办法几乎是一致的.
       不管正确与否,都得感谢各位,真理越辩越明!