1. 程式人生 > >(**.exe 中)處有未經處理的異常: 堆已損壞

(**.exe 中)處有未經處理的異常: 堆已損壞

問題描述:Debug模式下除錯程式沒有異常,在Release模式下執行,主程式退出時報異常。。。(**.exe 中)處有未經處理的異常: 。。。 堆已損壞。

出錯原因:先上一段簡單的程式碼。

class MyClass1
{
}
class MyClass2
{
}
class ClassManager
{
public:
    ClassManager(MyClass1* class1, MyClass2* class2;) : m_Class1(class1),
        m_Class2(class2){}
    ~ClassManager()
    {
        delete m_Class1;
        m_Class1 = NULL;
        delete m_Class2;
        m_Class1 = NULL;
    }
    ...

private:
    MyClass1* m_Class1;
    MyClass2* m_Class2;
}

int _tmain(int argc, _TCHAR* argv[])
{
    MyClass1 c1; MyClass2 c2;
    ClassManager cm(&c1, &c2);
    ...

    return 0;
}

出錯原因為主程式中的物件c1和c2並不是用new申請的記憶體,但是在ClassManager的解構函式中使用delete對其進行了釋放。

處理方法:刪除ClassManager的解構函式中的語句。

總結:new和delete要成對使用,且儘量放在一個檔案中,方便管理不容易出錯。