VC++ 出現Debug Assertion Failed!
阿新 • • 發佈:2019-01-05
最近編寫了一個升級裝置的控制元件,可以整合到不同的配置程式中,但是每次關閉工程或者關閉編輯頁面的時候就會出現這個錯誤,但是編譯和執行時沒有任何問題,僅僅在關閉編輯窗體頁面的時候會出現。
新增的控制元件
關閉編輯就會出現這個錯誤
控制元件程式碼編輯介面
通過多次的除錯發現,只要把控制元件程式碼的解構函式刪除掉就會解決這個問題
protected: /// <summary> /// 清理所有正在使用的資源。 /// </summary> ~SoftwareUpgradeControl() { if (components) { delete components; delete this->pUartTxBuff; delete this->pUartRxBuff; if (this->pFileBuff != nullptr) { delete this->pFileBuff; this->pFileBuff = nullptr; } } }
通過除錯發現問題出現在建構函式中申請記憶體導致的,如果不在建構函式申請記憶體或者釋放的時候有條件釋放,比如增加一個標記,程式執行後才釋放,在編輯過程中編譯器也會通過構造程式碼來繪製介面,這個時候申請記憶體,在關閉視窗時會釋放就會出問題,實際上知道讓程式在執行的時候釋放掉記憶體,在編輯的時候不呼叫就可以避免這個問題。
就是這2行申請記憶體導致的。//必須有一個不帶引數的建構函式,否則無法再工具箱中顯示 SoftwareUpgradeControl() { InitializeComponent(); // //TODO: 在此處新增建構函式程式碼 // this->isStartDownload = FALSE; //沒有開始下載 this->isGetInfo = FALSE; //是否獲取過資訊 //申請記憶體 this->pUartTxBuff = new BYTE[4096]; this->pUartRxBuff = new BYTE[4096];
//必須有一個不帶引數的建構函式,否則無法再工具箱中顯示 SoftwareUpgradeControl() { InitializeComponent(); // //TODO: 在此處新增建構函式程式碼 // this->isStartDownload = FALSE; //沒有開始下載 this->isGetInfo = FALSE; //是否獲取過資訊 this->isRun = false; //申請記憶體 this->pUartTxBuff = new BYTE[4096]; this->pUartRxBuff = new BYTE[4096];
增加一個isRun變數,在建構函式中將其設定為無效,在非建構函式中將其設定為有效,這樣析構就會識別出程式碼是否在執行狀態還是在預編譯狀態。
protected:
/// <summary>
/// 清理所有正在使用的資源。
/// </summary>
~SoftwareUpgradeControl()
{
if (components)
{
delete components;
if (this->isRun != false) //必須在程式執行的某個地方將isRun=ture,這樣在此處就會釋放記憶體,但是編輯的時候不會出現問題
{
delete this->pUartTxBuff;
delete this->pUartRxBuff;
}
if (this->pFileBuff != nullptr)
{
delete this->pFileBuff;
this->pFileBuff = nullptr;
}
}
}
解構函式,有條件的去釋放記憶體,這樣就可以解決編輯時產生的這個異常。
之前也遇到過,但是不知道產生這個問題的原因。