我是DLL的新手,但不是C ++的新手。对于一个项目,我需要在DLL中实现一些函数。我的问题:我可以将指针从我的主项目传递到DLL中的函数而不用担心什么吗?我发现它很奇怪,因为我的主项目中的地址是亲戚,所以传递给DLL的地址应该意味着别的东西。在任何地方都有诀窍吗?
感谢。
答案 0 :(得分:0)
同一地址空间中的任何模块(exe,dll等)都可以使用相同的指针。
当OS执行EXE时。它将EXE加载到EXE头中指定的地址的虚拟内存中,或者如果启用了EXE支持重定位和ASLR(地址空间布局随机化),则将其随机化地址。然后,依赖项(EXE使用的所有DLL)将被加载到同一地址空间中。
在模块之间传递指针时要担心的是分配和释放。您必须使用相同的相应功能来释放内存。如果使用HeapAlloc
,则必须使用HeapFree
释放具有相同堆的内存。
在Visual C ++中,真正的问题是malloc
和free
(new
和delete
)。想象模块A
用malloc
分配一块内存,并用Visual C ++ 8.0编译。使用Visual C ++ 9.0编译的模块B
。在这种情况下,您无法在模块free
中使用B
来释放模块malloc
中由A
分配的内存块,因为它不是相同的功能