首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

栈溢出出有关问题。0xC00000FD:Stack Overflow

2012-10-20 
栈溢出出问题。0xC00000FD:Stack Overflow当我开始调试时,总是出现一个框显示:Unhandled exception in YUV.

栈溢出出问题。0xC00000FD:Stack Overflow
当我开始调试时,总是出现一个框显示:Unhandled exception in YUV.exe:0xC00000FD:Stack Overflow
 好像是指针问题,内存释放的问题,可是不清楚怎么改啊???这个是VC6和opencv库函数一起编译的。
#include <iostream>
#include <stdlib.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
using namespace std;
//void saturate_sv( IplImage* img);
int main(int argc, char** argv[]){
int key=0;
char* filename="D:/002.avi";
CvCapture* capture = cvCreateFileCapture(filename);
if(capture==NULL) {
cout<<"NO capture"<<endl;
char a=getchar();
return 1;
};  
IplImage* frame;
cvNamedWindow("PlayAVI", CV_WINDOW_AUTOSIZE);
while(1) {
frame = cvQueryFrame( capture );
if(!frame) break;
  int i=0,b=0,r=0,sum1=0, sum2=0,avg1=0,avg2=0;从这行起就出问题了,以下各行设断点都是这个问题的
 
 int Y,Cb,Cr, yy[640*480],cb1[640*480],cr1[640*480],cb2[76800],cr2[76800];  
 
  for(int y=0; y<frame->height ;y++){
 
uchar*ptr=(uchar*)(frame->imageData+y*frame->widthStep);
 
for (int x=0;x<frame->width;x++ ){
 
Y=(int)(0.299*ptr[3*x+2]+0.587*ptr[3*x+1]+0.144*ptr[3*x]); //ptr[3*x+2]得到Y分量每个像素点采集一个Y分量
 
Cb=(int)(0.564*(ptr[3*x]-Y)+128);
 
Cr=(int)(0.713*(ptr[3*x+2]-Y)+128);

  yy[i]=Y; cb1[b]=Cb; cr1[r]=Cr;

  i++; r++; b++; //ptr[3*x+2] 是R红色通道,ptr[3*x+1]是G绿色通道,ptr[3*x]是B蓝色通道。
}
}

  for (int k=0; k<76800; k++){ //k的取值范围是0~76800

for (int l=4*k; l<=4*k+3; l++){ //l的取值范围是0~640*480=307200

  sum1+=cb1[b]; sum2+=cr1[r];
}

avg1=(int)sum1/4; avg2=(int)sum2/4;
 
cb2[k]=avg1; cr2[k]=avg2;
 
  sum1=0; sum2=0;
}

  FILE *file; 

file=fopen("d:\\file.yuv","ab");
   
fwrite (yy,4,640*480,file); 
   
fwrite (cb2,4,76800,file); 
 
fwrite (cr2,4,76800,file);  

fclose (file);  
  
cvShowImage("PlayAVI", frame );

key = cvWaitKey(33);// quit when users press 'ESC'

if( key == 27 ) break;

}

cvReleaseCapture(&capture);

cvDestroyWindow("PlayAVI"); 

return 0;

}

[解决办法]

[解决办法]
lz可以尝试以下几种方法:
1、二分法。尝试注释掉一半的代码,运行一下看看是否有问题。重复直到找到错误所在行。
2、下标检查。在每次使用下标操作符[]之前,用assert仔细检查下标是否超出范围。
3、用一款Memory debugger。Windows下推荐BoundsChecker。
[解决办法]
int Y,Cb,Cr, yy[640*480],cb1[640*480],cr1[640*480],cb2[76800],cr2[76800]; //这些占内存太大了。


int *yy=new int[640*480];

[解决办法]
既然是用C++,优先考虑vector<int>。
[解决办法]

探讨

int Y,Cb,Cr, yy[640*480],cb1[640*480],cr1[640*480],cb2[76800],cr2[76800]; //这些占内存太大了。


int *yy=new int[640*480];

[解决办法]
探讨
引用:

int Y,Cb,Cr, yy[640*480],cb1[640*480],cr1[640*480],cb2[76800],cr2[76800]; //这些占内存太大了。


int *yy=new int[640*480];


这个不是占内存大,而是占一个进程中的栈区太大,建议采用malloc,把数据放在堆中来。方法和5楼的一样。

热点排行