为什么delete指针会出现系统错误?下面的代码要频繁执行,所以我要删除指针分配的内存。代码如下:
        COperation  *ptOper = (COperation*)(m_pOpArray->GetAt(iCurSel));
        ASSERT(ptOper);
    
        ptOper->m_bGroup        = m_blGroup;
        ptOper->m_bExpected     = m_blExpected;       delete ptOper;  // 出现系统错误。去掉这行后就没有问题,这是为什么?

解决方案 »

  1.   

    指针被删除了多次
    加一句
    m_pOpArray->RemoveAt(iCurSel);
      

  2.   

    你new出来的要delete
    不是你new的最好不要delete
      

  3.   

    COperation  *ptOper = (COperation*)(m_pOpArray->GetAt(iCurSel));
    你这个指针对象如果是需要在m_pOpArray中长期保存的,那么,就不要delete,当确定该指针对象不需要使用时再delete
    如果是临时的,那么需要从m_pOpArray中删除该指针成员。否则自然会爆机,因为该指针指向的内容已经不知道是什么东东了,也就是常说的野指针了!
      

  4.   

    信息不充分。
    m_pOpArray是什么对象?它的具体实现是什么?
    还有COperation的具体实现是什么?
      

  5.   

       但是 每次进这个函数都要这么NEW一次呀!
       COperation  *ptOper = (COperation*)(m_pOpArray->GetAt(iCurSel));
        上面这条语句究竟是不是分配内存呀?如果每次进入本函数不是都要重新分配内存的话,我干脆去掉 delete ptOper;
      

  6.   

    TO  wangk(倒之):
     他们分别这么定义的。CObArrayM *m_pOpArray;class AFX_EXT_CLASS COperation : public CObject  
    {
    DECLARE_SERIAL(COperation);
    friend class CTestCase;
    public:
    BOOL UpdateIEofAllMsg(IEUpdateArea_T * pIEUpdateArea);
    BOOL StaIEofAllMsg(IEUpdateArea_T * pIEUpdateArea);
    void Serialize(CArchive &ar);
    virtual void Edit();
    virtual BOOL NeedYesNoText(CString& strPrompt);
    const COperation& operator=(const COperation& op);
    COperation();
    virtual ~COperation();
    BYTE    m_nType;
    BOOL m_bGroup;
             BOOL    m_bExpected;
      

  7.   

    COperation  *ptOper = (COperation*)(m_pOpArray->GetAt(iCurSel));
    不是分配内存,CObArray的实现是这样的:
    CObject* CObArray::GetAt(int nIndex) const
    { ASSERT(nIndex >= 0 && nIndex < m_nSize);
    return m_pData[nIndex]; }
    因此不必在每次访问完该元素就delete ptOper,我们就像使用数组一样使用它,如果你要删除该位置的元素,
    那么用m_pOpArray->RemoveAt(iCurSel);另如果m_pOpArray里放的是你new 出来的对象,在RemoveAt之后,还要再将对象删除。才不会有内存泄漏。
      

  8.   

    同意wangk(倒之)观点
    不需要delete
      

  9.   

    回复人: thisisll(速度八十迈) ( ) 信誉:101  2006-02-05 15:01:00  得分: 0  
     
     
       你new出来的要delete
    不是你new的最好不要delete  
     
    补充一个吧。就算delete后最好也是再把指针赋值成0  
      

  10.   

    COperation  *ptOper = (COperation*)(m_pOpArray->GetAt(iCurSel));
            ASSERT(ptOper);
        
            ptOper->m_bGroup        = m_blGroup;
            ptOper->m_bExpected     = m_blExpected;       delete ptOper;  // 出现系统错误。去掉这行后就没有问题,这是为什么?
    ~~~~~~~~~~~~~
    COperation  *ptOper = (COperation*)(m_pOpArray->GetAt(iCurSel));
    从lz的代码上可以看到,m_pOpArray是COperation对象的数组(暂时这么说),
    如果你放入的是通过new创建的对象,那么现在可以通过
    delete ptOper;
    删除这个对象,但是删除这个对象,并没有在m_pOpArray数组中删除
    这个对象的索引.所以如果楼主要删除这个对象.
    最好在加上
    m_pOpArray->DeleteAt(iCurSel));
    // DeleteAt是删除m_pOpArray中的第iCurSel个对象的索引.
    // 楼主自己实现.
    如果楼主添加对象是在栈上创建的
    COperation pp;
    COperation *p = pp;
    m_pOpArray中如果放入的是p.那么那么delete ptOper肯定
    会出现错误,这就是
    用delete删除栈上对象的问题.
    我猜想lz是上面的这种情况!
      

  11.   

    同意 ugg(逸学堂(exuetang.net)) ,
      

  12.   

    绝对不需要delete.
    =====
    COperation  *ptOper = (COperation*)(m_pOpArray->GetAt(iCurSel));
            ASSERT(ptOper);
        
            ptOper->m_bGroup        = m_blGroup;
            ptOper->m_bExpected     = m_blExpected;

            m_pOpArray->GetAt(iCurSel)->m_bGroup        = m_blGroup;
            m_pOpArray->GetAt(iCurSel)->m_bExpected     = m_blExpected;
    等价.
      

  13.   

    你new的要delete,你malloc的要free。不是你的,不释放还泄漏的,属于设计问题