网站首页 > 技术文章 正文
嘿嘿嘿,这个坑我在工作中发现很多同事都踩进去过,而且半天出不来,怎么调怎么都不对(看戏(我没有))
先回答“C++单例模式跨DLL是不是就是会出问题”这个问题,后面再解释。以后同事再问我也可以拿这个回答直接给他看,省得费口舌了。
C++单例模式跨DLL是不是就是会出问题——如果没有使用对就会有问题,或者说你只是看网上的各种初学者博客上一顿互抄的文章,简单地在类里使用了一下static变量作为单例,并期望这个单例能跨动态库,那就出问题了。比如一堆博客中都会给出的这段代码就是有问题的:
static变量是单个编译单元的静态变量,内存将被分配于当前的编译单元中,此时如果你编可执行文件的代码和编动态库的代码都包含了上述的单例头文件,那么这个“单例”将会出现两个实例,一个实例的内存在可执行文件中,一个实例的内存在动态链接库中,在运行存在于可执行文件中的代码段时,使用的是可执行文件中的那一份“单例”,而在运行存在于动态链接库中的代码段时,使用的则是动态链接库中的那一份“单例”,这其实本质就是所谓的动态链接库间的内存隔离导致的问题。
解决这个问题有两条路:
1.设计代码时选好单例的内存该放在哪,然后通过导入导出解决(MSVC上导入导出使用__declspec(dllimport)和__declspec(dllexport),类比extern变量)。比如单例打算放在动态链接库A中,那就在生成动态库A的地方的这个static变量导出,其他动态链接库或可执行文件使用的地方导入。
2.搞个统一的地方大家的单例共同注册到一起,用的时候拿出来。
我采用的解决方式是第2种,大家共同把单例注册到一个独立的动态库singleton_manager中,使用时只需要继承GlobalSingleton<T>即可(需要注意我实现的这个单例的singleton_manager只记录了指针,如果有热卸载动态库的需求,那么不适用)TG:li9047
- 上一篇: C++的23种设计模式(上篇-创建型模式)
- 下一篇: C++核心准则边译边学-I.3 避免单例
猜你喜欢
- 2024-09-24 学习C++之良好的编程习惯与编程要点
- 2024-09-24 大一萌新看过来,“这样”学C++,让你不再迷茫
- 2024-09-24 学习单例模式引发的思考
- 2024-09-24 C++中相互依赖的全局变量初始化策略
- 2024-09-24 零基础学习C++
- 2024-09-24 c++的面试总结
- 2024-09-24 避免踩坑,C++常见面试题的分析与解答
- 2024-09-24 20道必须掌握的C++题,纸上谈兵惯用伎俩
- 2024-09-24 C++11魔法静态变量magic static
- 2024-09-24 C++11 中值得关注的几大变化
你 发表评论:
欢迎- 02-20利用神经网络模型检测摄像头上的可疑行为
- 02-20直击心灵:高频核心听力你了解吗?_高频听力的正常范围值是多少
- 02-20YOLOv8 POSE+XGBoost进行人体姿态检测
- 02-20100个篮球英文术语详细解释,从此听懂NBA解说
- 02-20最全紧固件中英文对照,外贸必备词典一
- 02-20带你开发一个视频动态手势识别模型
- 02-20详细介绍一下Java基础中HashMap如何进行扩容操作?
- 02-20GTX 1070 Ti显卡评测:你会购买哪一款?
- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)