VC++ 出现Debug Assertion Failed! 问题的解决记录
扫描二维码
随时随地手机看文章
最近编写了一个升级设备的控件,可以集成到不同的配置程序中,但是每次关闭工程或者关闭编辑页面的时候就会出现这个错误,但是编译和运行时没有任何问题,仅仅在关闭编辑窗体页面的时候会出现。
添加的控件
关闭编辑就会出现这个错误
控件代码编辑界面
通过多次的调试发现,只要把控件代码的析构函数删除掉就会解决这个问题
protected: /// /// 清理所有正在使用的资源。 /// ~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: /// /// 清理所有正在使用的资源。 /// ~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; } } }
析构函数,有条件的去释放内存,这样就可以解决编辑时产生的这个异常。
之前也遇到过,但是不知道产生这个问题的原因。