DLL 中具有多个类和全局变量的多个 DLL
multiple dlls with multiple classes and global variables in dll
大家,一天中的好时光!
我对C++.dll编程有一些疑问,这对我来说是相当新的。
1)如果我想创建具有多个类的DLL,但我仍然想为每个类创建抽象接口,我应该为接口创建一个头文件,还是为每个抽象类创建单独的多个头文件?我应该如何处理工厂功能的实现.cpp?
2)如果我创建对象和工厂函数,并获取指向实例的指针,那么当我想释放该内存时,我可以在程序中调用"删除"吗?我认为,该对象放置在dll的页面中,可能存在一些问题。在这种情况下,我应该怎么做才能正确释放内存?
3)我读到,如果多个进程绑定.dll - dll为每个项目创建全局变量的单独实例。对吗?那么如果这是真的,我有两个问题:
3.1)dll中的静态成员会发生什么?如果我想创建单一实例管理器,是否可以将其放在 dll 中?
3.2)如果我有核心.dll和图形.dll,声音.dll和物理.dll。Core.dll 有一个全局变量(在我的真实情况下是一个单例管理器)。其他 dll 是否适用于单例的一个实例或其他实例?(每个 dll 都使用核心.dll)
对于我的英语薄弱和在一个主题中的许多问题,我深表歉意:)
感谢您的关注和回答。
1:这主要取决于您,并取决于项目的规模。在小的事情上,它无关紧要,所以保持简单并有一个标题。在较大的项目中,最好尽可能减少不必要的相互依赖关系 - 因此将它们放在单独的文件中。您始终可以创建仅包含其他内容的"all.h"。
2:是的,如果 DLL 和 EXE 都链接到多线程 DLL CRT。除非您知道自己在做什么,否则请始终使用它,因为它是最安全的并且会做您期望的 - 它会导致 exe 和 dll(s) 能够共享堆,就好像它们是单个可执行文件一样。您可以在 dll 中自由地"new Object()"和 exe 中的"删除 obj"。注意:混合不同版本的 EXE 和 DLL 可能会引入非常微妙的错误(例如,如果类/结构定义发生变化),所以不要这样做。
3:每个进程都有自己独立的内存空间(除非你专门做某些事情来尝试获取一些共享内存)。不允许进程进入其他进程的内存。
3.1:我强烈建议你避免全局状态。(全局静态常量是可以的)。全局变量会导致许多意想不到的困难问题,Windows DLL 中的全局变量具有许多其他复杂性。 从长远来看,最好在 EXE 必须调用的 DLL 中使用显式的"初始化/取消初始化"函数。
但是,dll 中的全局静态与可执行文件中的全局静态没有太大区别......加载 DLL 时,它们以几乎相同的方式进行初始化。(动态加载 DLL 时,操作会变得更加复杂,但让我们在这里忽略它)。
3.2:是的,他们会使用单个实例 - 但无论如何不要这样做,你最终会后悔的。使初始化显式要好得多,因为您无法控制构造全局变量的顺序,这很快就会导致非常困难的初始化问题。
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 内联函数中具有内部链接的全局变量
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局变量 多读取器 一个写入器多线程安全?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 不同作用域中的静态变量和全局变量
- C++ 在编译时具有函数计算全局变量
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 在链接到两个 exe 的 dll 中共享全局变量
- DLL libarry 中相同的静态和全局变量
- 如何从C++DLL导出全局变量
- DLL 中具有多个类和全局变量的多个 DLL
- 在同一DLL的实例之间共享静态和全局变量
- c#中如何从带有全局变量的c++ dll函数中获取返回数组
- DLL的全局变量存储在内存中
- DLL中使用的全局变量
- 在DLL和exe中使用全局变量
- 在DLL中定义的全局变量和宿主软件的全局变量