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





