VS程序debug和Release结果不同时的一些解决办法

今天在调试MFC代码的时候遇到了debug和release下运行结果不同的问题, 仔细检查了2小时才发现原来是一个函数调用写错了:

不慎将memcpy打成了memccpy, 

编译运行都没有问题,但是运行的时候总有异常。

原来

void * memccpy(void *dest, const void * src, int c, size_t n);

函数说明:memccpy()用来拷贝src 所指的内存内容前n 个字节到dest 所指的地址上。

void *memcpy(void *destin, void *source, unsigned n); 只有三个参数。

如果只传了3个参数给 memccpy, 那么这一段的数据会陷入混乱, 并且debug和release下运行的结果也不同,都是不正确的。

 

我就顺便总结一下我以前也遇到过这类问题的解决办法吧, 欢迎大家交流、补充。

二)内存溢出

debug模式下 较大的数组或结构体分配的地址通常不是连续的, 如果往数组里写数据溢出了,在debug模式下会写到一些无用的区域, 但是Release模式下很可能会写到别的相邻的数组中,打乱了别的数组里的数据。

这时从结果来看,就会出现一些随机的异常。

三)变量未初始化

由于Release模式下无法打断点,我们可以把结果输出到本地文档,

用下面的代码在release模式测试一下:

    int a,b;
    a = b;

    {
        FILE* fp = fopen("D:\\1.txt","a");
        if (fp == NULL)
        {
            return;
        }
        fprintf(fp,"a= ");
        fprintf(fp,"%d",a);
        fclose(fp);
    }

执行后,打开对应的 txt文档看到 a= 11088576, 程序随机分配了一个很大的数给a。

如果是debug模式呢?

程序会报警,这也是vs的一个优点。但如果在别的IDE上也可能不会报错。

这也会造成隐患,使Release的程序运行异常。

 

 

综上所述,如果程序运行在debug和release下的结果不同,那就要仔细检查代码了。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章