user-0 提问: 大神解答啊！Windows 已在 xx.exe 中触发一个断点。  其原因可能是堆被损坏，这说明 .exe 中或它所加载

回复:
user: user-1
content: 引用 15 楼 wo252518553 的回复:我后来发现可能是我申请的buf越界了，所以无法释放，所以我在申请的时候多申请100个，就没问题了。。  buff 不够，加个检查if (buffsize > MAX_VALUE) { buffsize = MAX_VALUE}

user: user-0
content: 我后来发现可能是我申请的buf越界了，所以无法释放，所以我在申请的时候多申请100个，就没问题了。。

user: user-2
content: 我猜是其他地方使用堆栈有问题...

user: user-3
content: int hh = height/h, ww = width/w; 你的情况，这个地方很有可能是出现 h或w的值为0！   如果不是这个情况，建议你查看下调用堆栈，或者打印一些过程信息更详细地描述错误情况。贴这么多代码不是个好习惯。

user: user-0
content: 引用 12 楼 qc437700093 的回复:int hh = height/h, ww = width/w; 你的情况，这个地方很有可能是出现 h或w的值为0！   如果不是这个情况，建议你查看下调用堆栈，或者打印一些过程信息更详细地描述错误情况。贴这么多代码不是个好习惯。 中断以后我点继续出现下面提示： Text Detection.exe 中的 0x7513812f 处有未经处理的异常: Microsoft C++ 异常: 内存位置 0x002edfa0 处的 std::bad_alloc。

user: user-0
content: 引用 12 楼 qc437700093 的回复:int hh = height/h, ww = width/w; 你的情况，这个地方很有可能是出现 h或w的值为0！   如果不是这个情况，建议你查看下调用堆栈，或者打印一些过程信息更详细地描述错误情况。贴这么多代码不是个好习惯。  	ntdll.dll!76ef3845() 	  	[下面的框架可能不正确和/或缺失，没有为 ntdll.dll 加载符号]	  	ntdll.dll!76ef47a3() 	  	ntdll.dll!76e85ae0() 	  	ntdll.dll!76ef5f63() 	  	ntdll.dll!76eba40a() 	  	ntdll.dll!76e85ae0() 	 >	msvcr100d.dll!_heap_alloc_base(unsigned int size)  行 55	C  	msvcr100d.dll!_heap_alloc_dbg_impl(unsigned int nSize, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp)  行 431 + 0x9 字节	C++  	msvcr100d.dll!_nh_malloc_dbg_impl(unsigned int nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp)  行 239 + 0x19 字节	C++  	msvcr100d.dll!_nh_malloc_dbg(unsigned int nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine)  行 302 + 0x1d 字节	C++  	msvcr100d.dll!malloc(unsigned int nSize)  行 56 + 0x15 字节	C++  	msvcr100d.dll!operator new(unsigned int size)  行 59 + 0x9 字节	C++  	opencv_highgui244d.dll!0f80b5a2() 	  	opencv_highgui244d.dll!0f80aec9() 	  	opencv_highgui244d.dll!0f813cf1() 	  	opencv_highgui244d.dll!0f810159() 	  	opencv_highgui244d.dll!0f80f22e() 	  	Text Detection.exe!SaveImage(_IplImage * pImage, char * imgname, int label1, int label2)  行 92 + 0x12 字节	C++  	Text Detection.exe!StatisticalFeature(_IplImage * src, _IplImage * pImage, _ROIINFO * proiinfo, char * imgname)  行 2368 + 0x14 字节	C++  	Text Detection.exe!CC_SFeature(_IplImage * src, _IplImage * pImage, _ROIINFO * proiinfo, char * imgname)  行 1865 + 0x15 字节	C++  	Text Detection.exe!StrokeFeatureValue(_IplImage * src, _IplImage * pImage, _ROIINFO * proiinfo, char * imgname)  行 1332 + 0x18 字节	C++  	Text Detection.exe!wmain(int argc, wchar_t * * argv)  行 3669 + 0x1b 字节	C++  	Text Detection.exe!__tmainCRTStartup()  行 552 + 0x19 字节	C  	Text Detection.exe!wmainCRTStartup()  行 371	C  	kernel32.dll!7699ee1c() 	  	ntdll.dll!76e937eb() 	  	ntdll.dll!76e937be() 	 调用堆栈里面是这么显示的，我也不懂什么意思，我是新手啊，对调试工作不太懂，唉惭愧！

user: user-0
content: 引用 9 楼 wo252518553 的回复:[quote=引用 7 楼 xpdavis 的回复:] 你把所有这些有new出来的数组，访问下标全部跟踪一下，看看有没越界的。这代码乱的 如果越界了怎么解决？是得知道在哪越界了吗？[/quote] 我想我应该是调用的函数太多了，就是一个函数调用另一个函数，嵌套太多层。。麻烦再问一个问题哈，如果需要定义多个缓冲区，就是用new 分配，如果不想嵌套的话，那就得返回这个缓冲区的给其他函数使用，那要如何返回，还是说全局变量不需要返回？

user: user-0
content: 引用 7 楼 xpdavis 的回复:你把所有这些有new出来的数组，访问下标全部跟踪一下，看看有没越界的。这代码乱的 如果越界了怎么解决？是得知道在哪越界了吗？

user: user-4
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。  判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

user: user-5
content: 你把所有这些有new出来的数组，访问下标全部跟踪一下，看看有没越界的。这代码乱的

user: user-0
content: void FeatureKMeans( IplImage* src, IplImage* pImage, ROIINFO *proiinfo, char *imgname ) { 	int height=pImage->height,width=pImage->width; 	int *cluster=new int[height*width]; 	//cluster数组赋初值 	for(int i=0;i<height;i++) 		for(int j=0;j<width;j++) 			cluster[i*width+j]=-1;  	IplImage* FeatureKMImg=NULL; 	CvScalar pixel; 	pixel.val[0]=0; 	FeatureKMImg = cvCreateImage(cvSize(width, height), 8, 1 ); 	//FeatureKMImg赋初值  	for (int i=0;i<height;i++)      {         for (int j=0;j<width;j++) 		{ 			cvSet2D(FeatureKMImg,i,j,pixel); 		} 	 } 	double Max=-10000,Min=10000; 	for (int i=0;i<height;i++)      {         for (int j=0;j<width;j++) 		{ 			pixel=cvGet2D(pImage,i,j); 			if(Max < pixel.val[0]) Max = pixel.val[0]; 			if(Min > pixel.val[0] && pixel.val[0] != 0) Min = pixel.val[0]; 		} 	} 	 	double d1=0,d2=0; 	//聚类 	double mmax,mmin; 	for (int i=0;i<height;i++)      {         for (int j=0;j<width;j++) 		{ 			pixel=cvGet2D(pImage,i,j); 			d1=sqrt((pixel.val[0]-Max)*(pixel.val[0]-Max)); 			d2=sqrt((pixel.val[0]-Min)*(pixel.val[0]-Min)); 			if(d1<d2) { mmax=(Max+pixel.val[0])/2;Max=mmax;cluster[i*width+j]=0; } 			else { mmin=(Min+pixel.val[0])/2;Min=mmin;cluster[i*width+j]=1; } 		} 	 } 	 	//Max=(int)Max;Min=(int)Min; 	pixel.val[0]=255; 	for (int i=0;i<height;i++)      {         for (int j=0;j<width;j++) 		{ 			/*pixel=cvGet2D(pImage,i,j); 			if(cluster[i*width+j]==0)cvSet2D(FeatureKMImg,i,j,pixel);*/ 			if(cluster[i*width+j]==0)cvSet2D(FeatureKMImg,i,j,pixel); 		} 	 } 	//释放cluster数组空间 	delete[] cluster; 	//color reverse 	for (int i=0;i<height;i++)      {         for (int j=0;j<width;j++) 		{ 			pixel=cvGet2D(FeatureKMImg,i,j); 			if(pixel.val[0]==0){pixel.val[0]=255;cvSet2D(FeatureKMImg,i,j,pixel);} 			else {pixel.val[0]=0;cvSet2D(FeatureKMImg,i,j,pixel);} 			 		} 	 } 	//保存图像 	SaveImage( FeatureKMImg,imgname,0,2 ); 	 	CC_SFeature(src,FeatureKMImg,proiinfo,imgname); 	 	cvWaitKey(0);  	//释放变量	 	cvReleaseImage(&FeatureKMImg); 	return; } void StatisticalFeature( IplImage* src, IplImage* pImage, ROIINFO *proiinfo, char *imgname ) { 	double *s=new double[1500*1500]; double *f=new double[1500*1500]; 	double F=0; 	double S=0; 	int w=24; 	int h=24; 	CvScalar pixel; 	int height=src->height,width=src->width; 	for(int i=0;i<1500;i++) 		for(int j=0;j<1500;j++) 		{s[i*1500+j]=-1;f[i*1500+j]=-1;} 	for(int i=0;i<height/h;i++) 		for(int j=0;j<width/w;j++) 		{ 			double sum1=0; 			double sum2=0; 			for(int p=i*h;p<h+i*h;p++) 				for(int q=j*w;q<w+j*w;q++) 					{ 						pixel=cvGet2D(pImage,p,q); 						sum1+=pixel.val[0]; 					} 			F=sum1/(w*h); 			f[i*width/w+j]=F; 			for(int p=i*h;p<h+i*h;p++) 				for(int q=j*w;q<w+j*w;q++) 					{ 						pixel=cvGet2D(pImage,p,q); 						sum2+=(pixel.val[0]-f[i*width/w+j])*(pixel.val[0]-f[i*width/w+j]); 					} 			S=sqrt(sum2/(w*h)); 			s[i*width/w+j]=S; 		} 	 	StatisKMeans(src,pImage,s,f,proiinfo,imgname); 	 	return; }

user: user-0
content: void CC_SFeature( IplImage* src, IplImage* pImage, ROIINFO *proiinfo, char *imgname ) { 	int height = src->height,width = src->width; 	IplImage* ConcomImg=NULL; 	ConcomImg = cvCreateImage(cvSize(width,height), 8, 1 ); 	CvScalar pix1,pix2,pix3,pix4;//上、左、左上、右上 	//ConcomImg赋初值 	CvScalar pixel; 	pixel.val[0]=255; 	for (int i=0;i<height;i++)      {         for (int j=0;j<width;j++) 		{ 			cvSet2D(ConcomImg,i,j,pixel); 			/*cvSet2D(ConcomImg2,i,j,pixel); 			cvSet2D(ConcomImg3,i,j,pixel); 			cvSet2D(ConcomImg4,i,j,pixel); 			cvSet2D(ConcomImg1,i,j,pixel);*/ 		} 	 } 	/*for(int i=0;i<height;i++) 		for(int j=0;j<width;j++) 		{ 			pixel=cvGet2D(pImage,i,j); 			if(pixel.val[0]==0) 			{ 				pixel.val[0]=255;cvSet2D(ConcomImg2,i,j,pixel); 			} 			else  			{ 				pixel.val[0]=0;cvSet2D(ConcomImg2,i,j,pixel); 			} 		}*/ 	int *buf =new int [height*width]; 	int *buff =new int [height*width]; 	for(int i=0;i<height;i++) 		for(int j=0;j<width;j++) 		{ 			buf[i*width+j]=0; 			//buff[i*width+j]=0; 		} 	int count=1; 	int rp=0;//记录右上点label 	int prep=0;//记录当前点label 	for (int i=0;i<height;i++)      {         for (int j=0;j<width;j++) 		{ 			//检测左上角像素 			if(i==0&&j==0) 			{ 				pixel=cvGet2D(pImage,i,j); 				if(pixel.val[0]==0){buf[i*width+j]=count++;} 			} 			//检测第一行像素：左 			else if(i==0) 			{ 				pixel=cvGet2D(pImage,i,j); 				if(pixel.val[0]==0) 				{ 					pix2=cvGet2D(pImage,i,j-1);//左点像素 					if(pix2.val[0]==0)buf[i*width+j]=buf[i*width+j-1]; 					else buf[i*width+j]=count++; 				} 			} 			//检测第一列像素：上、右上 			else if(j==0) 			{ 				pixel=cvGet2D(pImage,i,j); 				if(pixel.val[0]==0) 				{ 					pix1=cvGet2D(pImage,i-1,j);//上点像素 					pix4=cvGet2D(pImage,i-1,j+1);//右上点像素 					if(pix1.val[0]==0) buf[i*width+j]=buf[(i-1)*width+j];//上点有值 					else if(pix4.val[0]==0) buf[i*width+j]=buf[(i-1)*width+j+1];//上点无值，右上点有值 					else buf[i*width+j]=count++;//上、右上都无值 				} 			} 			//检测最后一列像素：上、左、左上 			else if(j==width-1) 			{ 				pixel=cvGet2D(pImage,i,j); 				if(pixel.val[0]==0) 				{ 					pix1=cvGet2D(pImage,i-1,j);//上点像素 					pix2=cvGet2D(pImage,i,j-1);//左点像素 					pix3=cvGet2D(pImage,i-1,j-1);//左上点像素 					if(pix1.val[0]==0) buf[i*width+j]=buf[(i-1)*width+j];//上点有值 					else if(pix2.val[0]==0||pix3.val[0]==0)//若左点或者左上点有值 					{ 						if(pix2.val[0]==0) buf[i*width+j]=buf[i*width+j-1];//左点有值 						else if(pix3.val[0]==0) buf[i*width+j]=buf[(i-1)*width+j-1];//左上点有值 					} 					else buf[i*width+j]=count++;//上、左上都无值 				} 			} 			//检测中间行像素 			else  			{ 				pixel=cvGet2D(pImage,i,j); 				if(pixel.val[0]==0) 				{ 					pix1=cvGet2D(pImage,i-1,j);//上点像素 					pix2=cvGet2D(pImage,i,j-1);//左点像素 					pix3=cvGet2D(pImage,i-1,j-1);//左上点像素 					pix4=cvGet2D(pImage,i-1,j+1);//右上点像素 					if(pix1.val[0]==0)  					{ 						buf[i*width+j]=buf[(i-1)*width+j];//上点有值 					} 					else if(pix2.val[0]==0||pix3.val[0]==0)//若左点或者左上点有值 					{ 						if(pix2.val[0]==0) buf[i*width+j]=buf[i*width+j-1];//左点有值 						else if(pix3.val[0]==0) buf[i*width+j]=buf[(i-1)*width+j-1];//左上点有值 						if(pix4.val[0]==0) 						{ 							rp=buf[(i-1)*width+j+1];//右上点label值 							prep=buf[i*width+j];//当前点label值 							if(rp>prep)//若右上点label值大于当前点 							{ 								for (int m=0;m<height;m++) 								{ 									for (int n=0;n<width;n++) 									{ 										if(buf[m*width+n]==rp) 											buf[m*width+n]=prep; 										else if(buf[m*width+n]>rp) 											buf[m*width+n]--; 									} 								} 							count--; 							} 							else if(rp<prep)//若右上点label值小于当前点 							{ 								for (int m=0;m<height;m++) 								{ 									for (int n=0;n<width;n++) 									{ 										if(buf[m*width+n]==prep) 											buf[m*width+n]=rp; 										else if(buf[m*width+n]>prep) 											buf[m*width+n]--; 									} 								} 							count--; 							} 						} 					} 					else if(pix4.val[0]==0) buf[i*width+j]=buf[(i-1)*width+j+1];//上、左、左上点都无值 					else if(pix1.val[0]!=0&&pix2.val[0]!=0&&pix3.val[0]!=0&&pix4.val[0]!=0) buf[i*width+j]=count++; 				} 			} 		} 	 }  	 printf("%d",count); 	  	int imax,imin,jmax,jmin; 	 //纵横比过滤连通域 	 for(int k=1;k<count;k++) 	 { 		 imax=-1,imin=10000,jmax=-1,jmin=10000; 		 for (int i=0;i<height;i++) 		{ 			for (int j=0;j<width;j++) 			{ 				if(buf[i*width+j]==k) 				{ 					if(i>imax) imax=i; 					if(i<imin) imin=i; 					if(j>jmax) jmax=j; 					if(j<jmin) jmin=j; 				} 			} 		 } 		 double ratio=(double)(jmax-jmin)/(imax-imin); 		 if(ratio>9||ratio<0.1) 		 { 			 for (int i=0;i<height;i++) 			{ 				for (int j=0;j<width;j++) 				{ 					if(buf[i*width+j]==k)buf[i*width+j]=0; 				} 			 } 		     		 } 	 } 	   	int x; 	for(int k=1;k<count;k++) 	{ 		x=0; 		for (int i=0;i<height;i++) 		{ 			for (int j=0;j<width;j++) 			{ 				if(buf[i*width+j]==k) 				{ 					x++; 				} 			} 		} 		if(x<20) 		{ 			for(int i=0;i<height;i++) 			{ 				for (int j=0;j<width;j++) 				{ 					if(buf[i*width+j]==k) buf[i*width+j]=0; 				} 			} 		 		} 	} 	 	//笔划密度过滤连通域 	 	double y; 	for(int k=1;k<count;k++) 	{ 		imax=-1,imin=10000,jmax=-1,jmin=10000; 		x=0; 		for (int i=0;i<height;i++) 		{ 			for (int j=0;j<width;j++) 			{ 				if(buf[i*width+j]==k) 				{ 					x++; 					if(i>imax) imax=i; 					if(i<imin) imin=i; 					if(j>jmax) jmax=j; 					if(j<jmin) jmin=j; 				} 			} 		} 		y=x*1.0/((imax-imin)*(jmax-jmin)); 		if(y>0.95||(imax-imin)>height-50||(jmax-jmin)>width-50||y<0.03) 		{ 			for(int i=0;i<height;i++) 			{ 				for (int j=0;j<width;j++) 				{ 					if(buf[i*width+j]==k) buf[i*width+j]=0; 				} 			} 		} 	}    	//保存图像 	//SaveImage( src,imgname,0,5 ); 	SaveImage( ConcomImg,imgname,0,3 ); 	//黑白反色 	for(int i=0;i<height;i++) 		for(int j=0;j<width;j++) 		{ 			pixel=cvGet2D(ConcomImg,i,j); 			if(pixel.val[0]==0) 			{ 				pixel.val[0]=255;cvSet2D(ConcomImg,i,j,pixel); 			} 			else  			{ 				pixel.val[0]=0;cvSet2D(ConcomImg,i,j,pixel); 			} 		} 	 	delete buf,buff; 	 	StatisticalFeature( src,ConcomImg,proiinfo,imgname );  	cvReleaseImage( &ConcomImg ); 	 	return; }

user: user-0
content: 引用 3 楼 xpdavis 的回复:其中，s和f是我定义的两个全局缓冲区变量，是不是不能在调用函数里释放？  只要你是用new返回的值，就可以delete 我刚刚发现好像不是new的问题，真是汗啊。。还是帖代码吧，太长了，我自己都有点乱，希望大侠给看看到底是哪里的问题啊！运行到SaveImage函数后就会报错，可是其他地方调用SaveImage函数就不会出现问题，错误如下： Windows 已在 Text Detection.exe 中触发一个断点。 其原因可能是堆被损坏，这说明 Detection.exe 中或它所加载的任何 DLL 中有 Bug。 原因也可能是用户在 Text Detection.exe 具有焦点时按下了 F12。 输出窗口可能提供了更多诊断信息。  // Text Detection.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <windows.h>  #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string> #include <math.h> #include <direct.h> #include <stdlib.h> #include <io.h> #include <cv.h> #include <highgui.h> #include <opencv.hpp> #include <cxcore.h>  #include <legacy\legacy.hpp> #include <legacy/compat.hpp>   using namespace std; using namespace cv;  #define PI 3.1415926 以下地址省略了部分路径 #define SrcImgPath "ne/SceneTrialTest/" #define DesImgPath1 "on/result_SFeature/" #define DesImgPath2 "sult_SFilter/" #define DesSFDataPath "_Data/" #define SFPRDataPath "_SFilter/" 下面这个函数是用来保存处理后的图像的，根据不同的label定义不同的名字保存到不同的路径文件里面 ///////////////////////////////////////////////////////////////////////////////保存图像/////////////////////////////////////////////////////////////////////////// void SaveImage( IplImage* pImage, char *imgname, int label1, int label2 ) { 	int i; 	int len=strlen(imgname); 	char Path[260]={0},ImgName[80]={0}; 	strcpy(ImgName,imgname); 	for(i=0;i<4;i++) 	{ 		ImgName[len-1]='\0'; 		len--; 	} 	switch (label1)//label1=0:StrokeFeature; label1=1:SF; 	{ 	case 0:  		{ 			strcpy(Path,DesImgPath1); 			break; 		} 	case 1:  		{ 			strcpy(Path,DesImgPath2); 			break; 		} 	default: 		{ 			break; 		} 	} 	 	switch (label2) 	{ 		//StrokeFeature:label1=0 	case 0:	{ 				strcat(Path,ImgName); 				strcat(Path,"_canny.jpg"); 				cvSaveImage(Path,pImage); 				break; 			} 	case 1: { 				strcat(Path,ImgName); 				strcat(Path,"_StrFeatImg.jpg"); 				cvSaveImage(Path,pImage); 				break; 			} 	case 2: { 				strcat(Path,ImgName); 				strcat(Path,"_SFKMImg.jpg"); 				cvSaveImage(Path,pImage); 				break; 			} 	case 3: { 				strcat(Path,ImgName); 				strcat(Path,"_StrFeatCC.jpg"); 				cvSaveImage(Path,pImage); 				break; 			} 	case 4: { 				strcat(Path,ImgName); 				strcat(Path,"_StatisKMImg.jpg"); 				cvSaveImage(Path,pImage);[/color[color=#FF0000]]这里报错，这个case 4跟其他case没有区别，可是就是执行不下去 				break; 			} 	case 5: { 				strcat(Path,ImgName); 				strcat(Path,"_StrFeatRect.jpg"); 				cvSaveImage(Path,pImage); 				break; 			} 		//Stroke Filter:label1=1 	case 6: { 				strcat(Path,ImgName); 				strcat(Path,"_SF_b.jpg"); 				cvSaveImage(Path,pImage); 				break; 			} 	case 7: { 				strcat(Path,ImgName); 				strcat(Path,"_SF_d.jpg"); 				cvSaveImage(Path,pImage); 				break; 			} 	case 8: { 				strcat(Path,ImgName); 				strcat(Path,"_SF_otsu.jpg"); 				cvSaveImage(Path,pImage); 				break; 			} 	case 9: { 				strcat(Path,ImgName); 				strcat(Path,"_SF_CC.jpg"); 				cvSaveImage(Path,pImage); 				break; 			} 	case 10: { 				strcat(Path,ImgName); 				strcat(Path,"_SF_Rect.jpg"); 				cvSaveImage(Path,pImage); 				break; 			 } 	default: 		{ 			break; 		} 	} 	 	return; }  void StrokeFeatureValue( IplImage* src, IplImage* pImage, ROIINFO *proiinfo, char *imgname ); void CC_SFeature( IplImage* src, IplImage* pImage, ROIINFO *proiinfo, char *imgname ); void FeatureKMeans( IplImage* src, IplImage* pImage, ROIINFO *proiinfo, char *imgname ); void StatisticalFeature( IplImage* src, IplImage* pImage, ROIINFO *proiinfo, char *imgname ); void StatisKMeans( IplImage* src, IplImage* pImage, double *s, double *f, ROIINFO *proiinfo, char *imgname ); void otsu( IplImage* src, IplImage *pImage, ROIINFO *proiinfo, char *imgname );  void StrokeFeatureValue( IplImage* src, IplImage* pImage, ROIINFO *proiinfo, char *imgname )//单通道图像 { 	IplImage* FeatureImg; 	int height=pImage->height,width=pImage->width; 	FeatureImg = cvCreateImage(cvSize(width, height), 8, 1 ); 	CvScalar pixel; 	int length=3; 	int c1,c2; 	double Stroke=0; 	int i,j,r,k,l; 	double max,sum; 	     for (i=0;i<height;i++)      {         for (j=0;j<width;j++)         { 			max=0;             for(r=0;r<4;r++) 			{	 				sum=0; 				if(r==0) 				{ 					c1=1; 					c2=0; 					for(k=-(length/2),l=0;k<=(length/2);k++) 					{	 						if((i+c1*k)>=0&&(i+c1*k)<=(height-1)&&(j+c2*l)>=0&&(j+c2*l)<=(width-1)) 						{ 							pixel=cvGet2D(pImage,(i+c1*k),(j+c2*l)); 							sum+=pixel.val[0]; 						} 				    } 					Stroke=sum/length; 					if(Stroke>max)max=Stroke; 				} 				else if(r==1) 				{ 					c1=1; 					c2=1; 					for(k=-(length/2),l=-(length/2);k<=(length/2)&&l<=(length/2);k++,l++) 					{	 						if((i+c1*k)>=0&&(i+c1*k)<=(height-1)&&(j+c2*l)>=0&&(j+c2*l)<=(width-1)) 						{ 							pixel=cvGet2D(pImage,(i+c1*k),(j+c2*l)); 							sum+=pixel.val[0]; 						} 				    } 					Stroke=sum/length; 					if(Stroke>max)max=Stroke; 				} 				else if(r==2) 				{ 					c1=0; 					c2=1; 					for(k=0,l=-(length/2);l<=(length/2);l++) 					{	 						if((i+c1*k)>=0&&(i+c1*k)<=(height-1)&&(j+c2*l)>=0&&(j+c2*l)<=(width-1)) 						{ 							pixel=cvGet2D(pImage,(i+c1*k),(j+c2*l)); 							sum+=pixel.val[0]; 						} 				    } 					Stroke=sum/length; 					if(Stroke>max)max=Stroke; 				} 				else if(r==3) 				{ 					c1=-1; 					c2=1; 					for(k=-(length/2),l=(length/2);k<=(length/2)&&l>=-(length/2);k++,l--) 					{	 						if((i+c1*k)>=0&&(i+c1*k)<=(height-1)&&(j+c2*l)>=0&&(j+c2*l)<=(width-1)) 						{ 							pixel=cvGet2D(pImage,(i+c1*k),(j+c2*l)); 							sum+=pixel.val[0]; 						} 				    } 					Stroke=sum/length; 					if(Stroke>max)max=Stroke; 				}	 			} 		 pixel.val[0]=(int)max; 		 cvSet2D(FeatureImg,i,j,pixel);         }      } 	//保存图像 	SaveImage( FeatureImg,imgname,0,1 );    	FeatureKMeans(src,FeatureImg,proiinfo,imgname ); 	 	cvReleaseImage(&FeatureImg); 	return; }

user: user-5
content: 其中，s和f是我定义的两个全局缓冲区变量，是不是不能在调用函数里释放？  只要你是用new返回的值，就可以delete

user: user-0
content: 引用 1 楼 xpdavis 的回复:我在另一个函数里也定义过这样一个buf，但是那个函数用完就释放了，和它有关系吗？  没有关系  我想，你最好把比较完整的代码贴上来  我发现我把int *buf =new int [hh*ww];改成int *buf =new int [height*width]; 以后就不会在这里报错了，其实中间就多了一步步骤，就是把height和width变小一些，这样就太大了。。 好在这样改以后就不会报错，可是到最后释放的时候就又报错了，最后一句释放语句如下： delete s,f,buf,Sta_cluster; 其中，s和f是我定义的两个全局缓冲区变量，是不是不能在调用函数里释放？

user: user-5
content: 我在另一个函数里也定义过这样一个buf，但是那个函数用完就释放了，和它有关系吗？  没有关系  我想，你最好把比较完整的代码贴上来