DLL内存分配返回空指针

3

我正在使用一个DLL,它执行一些内存分配并返回一个指针。 代码类似于:

ObjectClass *obj = FunctionFromDLL();

obj是一个有效的指针,但obj->SubObject是一个坏指针(0xcdcdcd)。

我检查了FunctionFromDLL(),它正确地分配了SubObject,但当函数返回给调用者时,该指针只得到了一个坏值。

这个DLL有什么特殊的方法可以“共享”内存吗?


2
你不需要对DLL做任何特殊处理来共享内存。DLL存在于同一地址空间中。你的问题是其他方面的问题。你是否试图在DLL边界传递C++对象?这只有在两端使用相同的编译器并使用“dllexport”/“dllimport”才能实现。在我们能够提供帮助之前,你需要告诉我们更多信息。 - David Heffernan
导出的 DLL 函数正在执行 __declspec(dllexport) ,而在导入的 .h 文件中我正在使用 __declspec(dllimport) 。 两个项目都是使用同一个 Visual Studio 编译的。 - Guillaume
1
那应该可以工作。通常的做法是在dll和导入程序中使用相同的头文件(使用在dll .cpp代码中定义的宏切换dllexport和dllimport)。你是这样做的吗,还是定义了不同的头文件? - Philip Couling
这个 DLL 是否可能使用了只有控制台应用程序(而不是 DLL)才能处理的东西? - Guillaume
我的猜测是:DLL 和调用者对于 ObjectClass 的定义不同,或者使用了不同的编译器或编译选项。这与内存分配无关。尝试在 DLL 中将 SubObject 指针赋一个固定值(比如 0x0FF),看看调用者是否能正确接收该值。 - Harry Johnston
显示剩余3条评论
2个回答

2

在dll和应用程序之间共享内存没有特殊的方法,只需确保在不再使用内存之后在dll中删除它。

编辑:0xCDCDCDCD:由微软的C ++调试运行时库用于标记未初始化的堆内存。


这个堆内存在 DLL 内被初始化(我用调试器检查过),然后在外部变得未初始化。 - Guillaume

0

这是因为我将_USE_32BIT_TIME_T定义为预处理器值。

我将其删除后,现在它可以正常工作。

谢谢大家。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接