C++ 在dll中具有多个类和全局变量的多个dll

C++ 在dll中具有多个类和全局变量的多个dll,c++,dll,C++,Dll,各位,一天中的好时光 关于C++的DLL编程,我有一些问题,对我来说是很新的。 1) 如果我想用多个类创建DLL,但我仍然想为每个类创建抽象接口,我应该为接口创建一个头文件,还是为每个抽象类创建单独的多个头文件?对于工厂函数的.cpp实现,我应该怎么做 2) 若我创建了对象和工厂函数,并得到了一个指向实例的指针,当我想释放内存时,我能在程序中调用“delete”吗?我认为,该对象被放置在dll的页面中,可能存在一些问题。在这种情况下,我应该如何正确释放内存 3) 我读到,如果有多个进程绑定.dl

各位,一天中的好时光

关于C++的DLL编程,我有一些问题,对我来说是很新的。 1) 如果我想用多个类创建DLL,但我仍然想为每个类创建抽象接口,我应该为接口创建一个头文件,还是为每个抽象类创建单独的多个头文件?对于工厂函数的.cpp实现,我应该怎么做

2) 若我创建了对象和工厂函数,并得到了一个指向实例的指针,当我想释放内存时,我能在程序中调用“delete”吗?我认为,该对象被放置在dll的页面中,可能存在一些问题。在这种情况下,我应该如何正确释放内存

3) 我读到,如果有多个进程绑定.dll-dll,那么它会为每个项目创建单独的全局变量实例。对吗?如果这是真的,我有两个问题:

3.1)dll中的静态成员会发生什么情况?如果我想创建一个单例管理器,我可以把它放在dll中吗

3.2)如果我有Core.dll和Graphics.dll、Sound.dll和Physics.dll。Core.dll有一个全局变量(在我的实际情况中是一个单例管理器)。其他DLL会使用一个singleton实例还是其他实例?(每个dll使用Core.dll)

很抱歉我的英语很差,一个话题有很多问题:)


感谢您的关注和回答。

1:这主要取决于您,取决于项目的规模。在一些小的事情上,它无关紧要,所以保持简单并有一个标题。在较大的项目中,最好尽可能减少不必要的相互依赖关系,因此将它们放在单独的文件中。您可以创建“all.h”,其中只包含其他内容

2:是,如果DLL和EXE都链接到多线程DLL CRT。除非您知道自己在做什么,否则请始终使用此选项,因为它是最安全的,并且会按照您的预期执行-它会导致exe和dll能够像共享单个可执行文件一样共享堆。您可以在dll中自由选择“新建对象()”,在exe中自由选择“删除对象”。 注意:混合使用不同版本的EXE和DLL可能会引入极其微妙的错误(例如,如果类/结构定义发生更改),所以不要这样做

3:每个进程都有自己独立的内存空间(除非您专门做某些事情来获取一些共享内存)。不允许进程访问其他进程的内存

3.1:我强烈建议您避免使用全局状态。(全局静态常数正常)。全局变量会导致许多意外和困难的问题,而Windows DLL中的全局变量还有许多额外的复杂性。从长远来看,在DLL中有EXE必须调用的显式“Initialize/Deinitialze”函数要好得多

但是,dll中的全局静态与可执行文件中的全局静态差别不大。。。加载DLL时,它们以几乎相同的方式初始化。(当您动态加载DLL时,事情会变得更复杂,但我们在这里忽略这一点)

3.2:是的,他们会处理单个实例-但无论如何不要这样做,你最终会后悔的。使初始化显式要好得多,因为您无法控制全局变量的构造顺序,这会很快导致非常困难的初始化问题