C++中Release版本和DEBUG版本编译选项差别的问题。
即如何设置编译选项能使RELEASE版本像DEBUG一样编译生成解决方案。我已经把RELEASE版中的下列选项设置成和DEBUG一样了,但还是运行出现问题(不是编译不通过...
即如何设置编译选项能使RELEASE版本像DEBUG一样编译生成解决方案。
我已经把RELEASE版中的下列选项设置成和DEBUG一样了,但还是运行出现问题(不是编译不通过,是计算结果不正确,DEBUG版一切正常)
/MD /ML 或 /MT 使用发布版本的运行时刻函数库,已经使用DEBUG版的运行时刻库
/O1 或 /O2 优化开关,使程序最小或最快,优化那一页已经设置成和DEBUG完全一样,优化全关了。
/D "NDEBUG" 关闭条件编译调试代码开关 (即不编译assert函数)
/GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改。
所以DEBUG版和RELEASE版的内存分配方式是不同的 ,如何设置能让RELEASE版像DEBUG版一样分配内存。还有将变量自动初始化开关关闭。网上的文档上没有说如何关闭这些编译选项。 展开
我已经把RELEASE版中的下列选项设置成和DEBUG一样了,但还是运行出现问题(不是编译不通过,是计算结果不正确,DEBUG版一切正常)
/MD /ML 或 /MT 使用发布版本的运行时刻函数库,已经使用DEBUG版的运行时刻库
/O1 或 /O2 优化开关,使程序最小或最快,优化那一页已经设置成和DEBUG完全一样,优化全关了。
/D "NDEBUG" 关闭条件编译调试代码开关 (即不编译assert函数)
/GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改。
所以DEBUG版和RELEASE版的内存分配方式是不同的 ,如何设置能让RELEASE版像DEBUG版一样分配内存。还有将变量自动初始化开关关闭。网上的文档上没有说如何关闭这些编译选项。 展开
3个回答
展开全部
你是不是有变量没有初始化或者用了诸如i=i++ + ++i这种未定义行为!这两种情况必须考虑!尽量别去考虑debug和release的内存分配方式!
追问
i=i++ + ++i这种未定义行为,这样的行为会被跳过么?我知道哪个函数RELEASE版出问题了,你能帮我看看哪里有问题么?
n = 4; int nr = img->height; int nc = img->width; int total = nr * nc; memset(labels, 0, total * sizeof(int));这是函数定义和变量初始化,你看看有没有问题。
追答
未定义行为是会被编译器跳过(不报错,不警告)但是就是会出问题的。。。
问题出在memset这里(应该是),memset在debug和release下有时候有执行差别。如果你的labels整个都要初始化你可以考虑替换为
const int tot = total;
数据类型 lables[tot] = {0};这样初始化。。。
然后你得检查一下你的debug版,把所有变量初始化全部检查一遍,因为release和debug的变量初始化是不一致的,一般这种问题都是由于debug初始化了变量而release没有导致的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询