VC++ 出現(xiàn)Debug Assertion Failed! 問題的解決記錄
最近編寫了一個升級設備的控件,可以集成到不同的配置程序中,但是每次關閉工程或者關閉編輯頁面的時候就會出現(xiàn)這個錯誤,但是編譯和運行時沒有任何問題,僅僅在關閉編輯窗體頁面的時候會出現(xiàn)。
添加的控件
關閉編輯就會出現(xiàn)這個錯誤
控件代碼編輯界面
通過多次的調(diào)試發(fā)現(xiàn),只要把控件代碼的析構函數(shù)刪除掉就會解決這個問題
protected: /// ///?清理所有正在使用的資源。 /// ~SoftwareUpgradeControl() { if?(components) { delete?components; delete?this->pUartTxBuff; delete?this->pUartRxBuff; if?(this->pFileBuff?!=?nullptr) { delete?this->pFileBuff; this->pFileBuff?=?nullptr; } } }
通過調(diào)試發(fā)現(xiàn)問題出現(xiàn)在構造函數(shù)中申請內(nèi)存導致的,如果不在構造函數(shù)申請內(nèi)存或者釋放的時候有條件釋放,比如增加一個標記,程序運行后才釋放,在編輯過程中編譯器也會通過構造代碼來繪制界面,這個時候申請內(nèi)存,在關閉窗口時會釋放就會出問題,實際上知道讓程序在運行的時候釋放掉內(nèi)存,在編輯的時候不調(diào)用就可以避免這個問題。
//必須有一個不帶參數(shù)的構造函數(shù),否則無法再工具箱中顯示 SoftwareUpgradeControl() { InitializeComponent(); // //TODO:?在此處添加構造函數(shù)代碼 // this->isStartDownload?=?FALSE; //沒有開始下載 this->isGetInfo?=?FALSE; //是否獲取過信息 //申請內(nèi)存 this->pUartTxBuff?=?new?BYTE[4096]; this->pUartRxBuff?=?new?BYTE[4096];
就是這2行申請內(nèi)存導致的。
//必須有一個不帶參數(shù)的構造函數(shù),否則無法再工具箱中顯示 SoftwareUpgradeControl() { InitializeComponent(); // //TODO:?在此處添加構造函數(shù)代碼 // this->isStartDownload?=?FALSE; //沒有開始下載 this->isGetInfo?=?FALSE; //是否獲取過信息 this->isRun?=?false; //申請內(nèi)存 this->pUartTxBuff?=?new?BYTE[4096]; this->pUartRxBuff?=?new?BYTE[4096];
增加一個isRun變量,在構造函數(shù)中將其設置為無效,在非構造函數(shù)中將其設置為有效,這樣析構就會識別出代碼是否在運行狀態(tài)還是在預編譯狀態(tài)。
protected: /// ///?清理所有正在使用的資源。 /// ~SoftwareUpgradeControl() { if?(components) { delete?components; if?(this->isRun?!=?false) //必須在程序運行的某個地方將isRun=ture,這樣在此處就會釋放內(nèi)存,但是編輯的時候不會出現(xiàn)問題 { delete?this->pUartTxBuff; delete?this->pUartRxBuff; } if?(this->pFileBuff?!=?nullptr) { delete?this->pFileBuff; this->pFileBuff?=?nullptr; } } }
析構函數(shù),有條件的去釋放內(nèi)存,這樣就可以解決編輯時產(chǎn)生的這個異常。
之前也遇到過,但是不知道產(chǎn)生這個問題的原因。