2 wessex2010 wessex2010 于 2016.09.22 15:23 提问

同一个动态链接库,debug版行了,但release版不行

请求高手,大师点拨

在VC++6.0环境下,我把一个运算程序做成动态链接库,取名为(wsxdll),在debug状态下生成的(wsxdll.dll和wsxdll.lib)调试通过,其外部函数也能被另一个应用程序(usewsx)正常调用完成运算。但同一个(wsxdll),在release状态下生成的(wsxdll.dll和wsxdll.lib)虽也能被应用程序(usewsx)调用,但运算出错。以下是一些细节说明
◆在release状态下编译(wsxdll)虽通过,但有warning
Linking...
Creating library Release/wsxdll.lib and object Release/wsxdll.exp
LINK : warning LNK4089: all references to "GDI32.dll" discarded by /OPT:REF
wsxdll.dll - 0 error(s),
◆(wsxdll)中用了堆结构的数据变量,
我发现,用debug版的(wsxdll.dll和wsxdll.lib)时,给堆分配物理内存后,堆变量中的默认值正常,如整型变量的默认值是(-842150451),但用Release版的(wsxdll.dll和wsxdll.lib)时,给堆分配物理内存后,堆变量中的默认值不正常,如整型变量的默认值是(3736336)或(0),甚至是(-1.#QNAN)。
注:给堆分配物理内存和释放分配于之的物理内存已在(wsxdll)中正确使用,否则debug版也通不过。

2个回答

fulcrumtech
fulcrumtech   2016.09.22 15:35

vc6的debug版本和relesae版本在代码逻辑上有一些区别,debug版本在分配内存后,会把内存用字节值“CD”填充,如果按4字节有符号整形解释,就是-842150451(CDCDCDCD),以便于跟踪内存泄露,但release版本不会初始化分配的内存,里面的内容是前一个使用过此内存的应用遗留下来的,所以需要增加初始化内存的代码,保证debug和release的一致性。

oyljerry
oyljerry   Ds   Rxr 2016.09.22 21:24

vc有一个简单原则。就是debug调用debug dll。同样release也是

Csdn user default icon
上传中...
上传图片
插入图片