在VC++6.0环境下,我把一个运算程序做成动态链接库,取名为(wsxdll),在debug状态下生成的(wsxdll.dll和wsxdll.lib)调试通过,其外部函数也能被另一个应用程序(usewsx)正常调用完成运算。但同一个(wsxdll),在release状态下生成的(wsxdll.dll和wsxdll.lib)虽也能被应用程序(usewsx)调用,但运算出错。以下是一些细节说明
A.在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),
B.(wsxdll)中用了堆结构的数据变量,
我发现,用debug版的(wsxdll.dll和wsxdll.lib)时,给堆分配物理内存后,堆变量中的默认值正常,如整型变量的默认值是(-842150451),但用Release版的(wsxdll.dll和wsxdll.lib)时,给堆分配物理内存后,堆变量中的默认值不正常,如整型变量的默认值是(3736336)或(0),甚至是(-1.#QNAN)。
注:给堆分配物理内存和释放分配于之的物理内存已在(wsxdll)中正确使用,否则debug版也通不过。
[/size]
4 个解决方案
#1
同一个库debug和release不能共用正常,debug用的库也要是debug版本的才行,release也一样
#2
debug版和release版分配内存不一样,debug版为了调试方便会在原有申请内存的基础上多分配百分之十几的空间;
估计你程序是内存管理问题。
估计你程序是内存管理问题。
#3
-842150451= CDCDCDCD 是debug 对变量的 初始化,你自己忘了初始化。
release 对变量不会初始化,所以 是 不确定值, 请 检查 所有变量 是否 初始化 !
release 对变量不会初始化,所以 是 不确定值, 请 检查 所有变量 是否 初始化 !
#4
release会做一些优化,同时会有一些初始化等。
你的变量最好都有默认的初始化值
然后就是调用者,dll最好都是相同的debug或release版本
你的变量最好都有默认的初始化值
然后就是调用者,dll最好都是相同的debug或release版本
#1
同一个库debug和release不能共用正常,debug用的库也要是debug版本的才行,release也一样
#2
debug版和release版分配内存不一样,debug版为了调试方便会在原有申请内存的基础上多分配百分之十几的空间;
估计你程序是内存管理问题。
估计你程序是内存管理问题。
#3
-842150451= CDCDCDCD 是debug 对变量的 初始化,你自己忘了初始化。
release 对变量不会初始化,所以 是 不确定值, 请 检查 所有变量 是否 初始化 !
release 对变量不会初始化,所以 是 不确定值, 请 检查 所有变量 是否 初始化 !
#4
release会做一些优化,同时会有一些初始化等。
你的变量最好都有默认的初始化值
然后就是调用者,dll最好都是相同的debug或release版本
你的变量最好都有默认的初始化值
然后就是调用者,dll最好都是相同的debug或release版本