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





