一天中的好时光,大家!
我对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是否可以使用单例或其他实例? (每个dll使用Core.dll)
我为我的弱英语和一个主题中的许多问题道歉:)
感谢您的关注和答案。
答案 0 :(得分:1)
1:这主要取决于你,取决于项目的规模。在一些小的东西上它很重要,所以保持简单并有一个标题。在较大的项目中,最好尽可能减少不必要的相互依赖性 - 因此将它们放在单独的文件中。您可以创建“all.h”,其中包含其他内容。
2:是的,如果DLL和EXE都链接到多线程DLL CRT。除非你知道自己在做什么,否则总是使用它,因为它是最安全的并且会按照你的期望行事 - 它会导致exe和dll能够共享堆,就好像它们是一个可执行文件一样。您可以在dll中“new Object()”并在exe中自由地“删除obj”。 注意:混合不同版本的EXE和DLL会引入令人难以置信的细微错误(例如,如果类/结构定义发生更改),所以不要这样做。
3:每个进程都有自己独立的内存空间(除非你专门做某些事情试图获得一些共享内存)。不允许进程占用其他进程。
3.1:我强烈建议你避免全局状态。 (全局static-const可以)。全局变量导致许多意外和困难的问题,Windows DLL中的全局变量具有许多额外的复杂性。从长远来看,在EXE必须调用的DLL中有明确的“初始化/取消初始化”函数要好得多。
但是,dll中的全局静态与可执行文件没有太大的不同......它们在加载DLL时以几乎相同的方式初始化。 (当你动态加载DLL时会变得更复杂,但是我们在这里忽略它。)
3.2:是的,他们会使用单一实例 - 但不管怎么说,你最终会后悔的。更好地使初始化显式化是因为你无法控制构造全局变量的顺序,这很快就会导致非常困难的初始化问题。