HEAP CORRUPTION DETECTED报错说明及解决方案

   日期:2020-07-10     浏览:112    评论:0    
核心提示:HEAP CORRUPTION DETECTEDBug说明问题的解决Bug说明最近写代码时遇到了一个Bug,报错如下图Debug Error!Program:工程位置HEAP CORRUPTION DETECTED:after Normal block(#xxxxxx)at 0x xxxxxxxxxxxxxxxxCRT detected that the application wrote to menory after end of heap buffer原因:这是典型的内存溢出错误,常

HEAP CORRUPTION DETECTED

  • Bug说明
  • 问题的解决

Bug说明

最近写代码时遇到了一个Bug,报错如下图

Debug Error!
Program:工程位置
HEAP CORRUPTION DETECTED:after Normal block(#xxxxxx)at 0x xxxxxxxxxxxxxxxx
CRT detected that the application wrote to menory after end of heap buffer

原因:

这是典型的内存溢出错误,常在内存的delete处发生,而且一般在debug版本中可能出现,release版本中可能并不报错。

出现这个错误的原因一般都是操作new申请的内存溢出,因为在c++中,如果用new分配一段内存,操作的时候改变了该部分的大小,在delete时就会出错。比如说如下部分:

char* p=new char[5]
strcpy(p,"aaaaa");
delete[] p;

这段代码就会出错,因为申请了一个size为5的内存,但是strcpy过去了一个size为6的字符串,因此破坏了这个指针,运行debug版本的时候就会出现先前的错误,但是在release版本中,溢出一个字节的内存很有可能是没有错误的,然后潜在的隐患是肯定存在的,因此,我们在debug遇到这样的错误时候一定要仔细检查对new出的指针的操作。

问题的解决

经调试,我发现我的代码在下面这部分出现了问题:

bool writecalibrationpara(Mat &homo, string filepath)
{
	//ini文件写入
	homo.convertTo(homo, CV_32FC1);
	LPTSTR lpPath = new char[MAX_PATH];//MAX_PATH:是微软最大路径占的字节所设的宏
	strcpy(lpPath, filepath.c_str());

	LPTSTR lpString1 = new char[100];
	stringstream ss1;
	ss1 << "[" << homo.at<float>(0, 0) << " , " << homo.at<float>(0, 1) << " , " << homo.at<float>(0, 2) << ";" 
	    << homo.at<float>(1, 0) << " , " << homo.at<float>(1, 1) << " , " << homo.at<float>(1, 2) << ";" 
	    << homo.at<float>(2, 0) << " , " << homo.at<float>(2, 1) << " , " << homo.at<float>(2, 2) << "]" << flush;
	string output1 = ss1.str();
	strcpy(lpString1, output1.c_str());
	WritePrivateProfileString("变换矩阵", "homo",lpString1, lpPath);
	
	delete [] lpString1;
	delete [] lpPath;//释放内存
	return true;
}

这段代码的功能是实现ini文件的写入,在释放lpString1的内存时出现了错误HEAP CORRUPTION DETECTED

修改方法:

LPTSTR lpString1 = new char[100];

new char没有初始化,应当对其进行初始化

LPTSTR lpString1 = new char[100]();
strcpy(lpString1, output1.c_str());

strcpy()不够安全,应当使用strncpy()

strncpy(lpString1, output1.c_str(),100);

我的代码中改完这两句就不会再报错了。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服