读书人

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

发布时间: 2012-10-20 14:12:48 作者: rapoo

栈溢出出问题。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楼的一样。

读书人网 >C++

热点推荐