导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

memcpy在release版本下崩溃,debug版本没问题?

ToperRay 2007-05-15 09:29:06
改为memmove也不行,CxImage里面的一个语句
...全文
1784 点赞 收藏 41
写回复
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoujiamurong 2007-05-21
实验下把Buffer再开很大,如果没有问题了,就是你越界了.还有你在要调试下在循环的第几次出现的问题.Release也可以调试的.
回复
plphoenix 2007-05-17
你先试试在release的编译设置里面,不要用速度最优化(默认是这个)。然后运行看看,如果可以说明编译器优化有问题。VC6确实存在这种bug的。
我以前就碰到和你一样的事情,还是VC自己生成的代码,release版本的就崩掉。
但是也有可能确实程序本身有问题,有些地方debug版本的不会去检查的,release的会去检查。
回复
qfsb_p 2007-05-17
学习,学习
回复
会思考的草 2007-05-17
呵呵,很简单,用vc2005编译一遍,如果release版下打开优化仍然出错,是你自己代码的问题的可能性非常大。
回复
zdleek 2007-05-17
两者可能:
1、内存越界,可能是由于你的代码计算位移或者数据长度出错(在某些条件下)
2、否则就是其他地方内存方位错误,正好改变了你这里用到的某些变量的值,从而产生异常
回复
Elysium 2007-05-16
可是memcpy应该没有问题啊
回复
ToperRay 2007-05-16
info是合法的,我检查过
回复
Elysium 2007-05-16
检查info是否是引用,是否合法,值是否已经初始化
回复
wangjun825 2007-05-16
出问题的时候不要想着系统或库函数的问题,99%以上都是代码的问题
回复
shawnwan 2007-05-16
优化出错的话,一定是代码本身依然有缺陷
回复
会思考的草 2007-05-16
建议你在memcpy之前,用IsBadWritePtr检查一下。
回复
ioleon13 2007-05-16
内存分配出问题了吧
回复
swimmer2000 2007-05-16
设个断点,通过memory window察看memcpy操作是否有误.
回复
dleah 2007-05-16
在Release版中,定义变量时要初始化的!
回复
ToperRay 2007-05-15
具体代码在这里

http://www.google.com/codesearch?hl=zh-CN&q=+(samplesperpixel%3D%3D1)+show:SU53G9lonYA:c9v64nQcVxM:EqL4u00LHDg&sa=N&cd=2&ct=rc&cs_p=http://www.ackronic.net/ackws/mod/3.1/emule0.46c_Ackronic_3.1_src.zip&cs_f=srchybrid/CxImage/ximatif.cpp#a0
回复
ToperRay 2007-05-15
在第六行的memcpy报错
回复
ToperRay 2007-05-15
for (y = 0; y < nrow; y++) {
long offset=(nrow-y-1)*line;
if (bitspersample==16) for (DWORD xi=0;xi<width;xi++) bits[xi+offset]=bits[xi*2+offset+1];
if (samplesperpixel==1) { //simple 8bpp image
memcpy(info.pImage+info.dwEffWidth*(height-ys-nrow+y),bits+offset,info.dwEffWidth);
} else if (samplesperpixel==2) { //8bpp image with alpha layer
int xi=0;
int ii=0;
int yi=height-ys-nrow+y;
while (ii<line){
SetPixelIndex(xi,yi,bits[ii+offset]);
#if CXIMAGE_SUPPORT_ALPHA
AlphaSet(xi,yi,bits[ii+offset+1]);
#endif //CXIMAGE_SUPPORT_ALPHA
ii+=2;
xi++;
if (xi>=(int)width){
yi--;
xi=0;
}
}
} else { //photometric==PHOTOMETRIC_CIELAB
if (head.biBitCount!=24){ //fix image
Create(width,height,24,CXIMAGE_FORMAT_TIF);
#if CXIMAGE_SUPPORT_ALPHA
if (samplesperpixel==4) AlphaCreate();
#endif //CXIMAGE_SUPPORT_ALPHA
}

int xi=0;
int ii=0;
int yi=height-ys-nrow+y;
RGBQUAD c;
int l,a,b,bitsoffset;
double p,cx,cy,cz,cr,cg,cb;
while (ii<line){
bitsoffset = ii*samplesperpixel+offset;
l=bits[bitsoffset];
a=bits[bitsoffset+1];
b=bits[bitsoffset+2];
if (a>127) a-=256;
if (b>127) b-=256;
// lab to xyz
p = (l/2.55 + 16) / 116.0;
cx = pow( p + a * 0.002, 3);
cy = pow( p, 3);
cz = pow( p - b * 0.005, 3);
// white point
cx*=0.95047;
//cy*=1.000;
cz*=1.0883;
// xyz to rgb
cr = 3.240479 * cx - 1.537150 * cy - 0.498535 * cz;
cg = -0.969256 * cx + 1.875992 * cy + 0.041556 * cz;
cb = 0.055648 * cx - 0.204043 * cy + 1.057311 * cz;

if ( cr > 0.00304 ) cr = 1.055 * pow(cr,0.41667) - 0.055;
else cr = 12.92 * cr;
if ( cg > 0.00304 ) cg = 1.055 * pow(cg,0.41667) - 0.055;
else cg = 12.92 * cg;
if ( cb > 0.00304 ) cb = 1.055 * pow(cb,0.41667) - 0.055;
else cb = 12.92 * cb;

c.rgbRed =(BYTE)max(0,min(255,(int)(cr*255)));
c.rgbGreen=(BYTE)max(0,min(255,(int)(cg*255)));
c.rgbBlue =(BYTE)max(0,min(255,(int)(cb*255)));

SetPixelColor(xi,yi,c);
#if CXIMAGE_SUPPORT_ALPHA
if (samplesperpixel==4) AlphaSet(xi,yi,bits[bitsoffset+3]);
#endif //CXIMAGE_SUPPORT_ALPHA
ii++;
xi++;
if (xi>=(int)width){
yi--;
xi=0;
}
}
}
}
}
回复
xujianlane 2007-05-15
以前遇到过LocalAlloc出错,但实际是在它之前的指针代入出错
回复
star119119 2007-05-15
这种情况以前我也预见过。

只能跟踪出现问题附近的语句一点一点察看内存。
回复
ToperRay 2007-05-15
初始化问题也考虑过,好象不是,似乎和整除有关,不知道大家有没有遇到这样的情况
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……