1. 程式人生 > >VC++ 出現Debug Assertion Failed!

VC++ 出現Debug Assertion Failed!

最近編寫了一個升級裝置的控制元件,可以整合到不同的配置程式中,但是每次關閉工程或者關閉編輯頁面的時候就會出現這個錯誤,但是編譯和執行時沒有任何問題,僅僅在關閉編輯窗體頁面的時候會出現。


新增的控制元件


關閉編輯就會出現這個錯誤


控制元件程式碼編輯介面

通過多次的除錯發現,只要把控制元件程式碼的解構函式刪除掉就會解決這個問題

	protected:
		/// <summary>
		/// 清理所有正在使用的資源。
		/// </summary>
		~SoftwareUpgradeControl()
		{
			if (components)
			{
				delete components;
				delete this->pUartTxBuff;
				delete this->pUartRxBuff;
				if (this->pFileBuff != nullptr)
				{
					delete this->pFileBuff;
					this->pFileBuff = nullptr;
				}
			}
		}

通過除錯發現問題出現在建構函式中申請記憶體導致的,如果不在建構函式申請記憶體或者釋放的時候有條件釋放,比如增加一個標記,程式執行後才釋放,在編輯過程中編譯器也會通過構造程式碼來繪製介面,這個時候申請記憶體,在關閉視窗時會釋放就會出問題,實際上知道讓程式在執行的時候釋放掉記憶體,在編輯的時候不呼叫就可以避免這個問題。
	//必須有一個不帶引數的建構函式,否則無法再工具箱中顯示
		SoftwareUpgradeControl()
		{
			InitializeComponent();
			//
			//TODO: 在此處新增建構函式程式碼
			//
			this->isStartDownload = FALSE;					//沒有開始下載
			this->isGetInfo = FALSE;						//是否獲取過資訊
			//申請記憶體
			this->pUartTxBuff = new BYTE[4096];
			this->pUartRxBuff = new BYTE[4096];
就是這2行申請記憶體導致的。
//必須有一個不帶引數的建構函式,否則無法再工具箱中顯示
		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;
				}
			}
		}
解構函式,有條件的去釋放記憶體,這樣就可以解決編輯時產生的這個異常。

之前也遇到過,但是不知道產生這個問題的原因。