如何通过符号导出策略有效避免跨DLL单例内存冲突问题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计893个文字,预计阅读时间需要4分钟。
跨DLL共享单例会导致内存崩溃,根本原因不是不够标准,而是每个模块(EXE/DLL)拥有独立的C++运行时堆和独立的STL静态实例。只需在DLL中`new`、`std::string`赋值,或在EXE中直接`delete`裸指针,就极大可能触发`HEAP CORRUPTION DETECTED`或`Access violation reading location 0xCCCCCCCC`。
为什么static Singleton& getInstance()在头文件里一用就错
问题不在语法,而在链接行为:当头文件被EXE和多个DLL同时#include,每个编译单元都会生成一份getInstance的inline定义,而C++标准不保证这些static局部变量指向同一块内存——它们分别落在EXE的.data段、DLL A的.data段、DLL B的.data段里。
本文共计893个文字,预计阅读时间需要4分钟。
跨DLL共享单例会导致内存崩溃,根本原因不是不够标准,而是每个模块(EXE/DLL)拥有独立的C++运行时堆和独立的STL静态实例。只需在DLL中`new`、`std::string`赋值,或在EXE中直接`delete`裸指针,就极大可能触发`HEAP CORRUPTION DETECTED`或`Access violation reading location 0xCCCCCCCC`。
为什么static Singleton& getInstance()在头文件里一用就错
问题不在语法,而在链接行为:当头文件被EXE和多个DLL同时#include,每个编译单元都会生成一份getInstance的inline定义,而C++标准不保证这些static局部变量指向同一块内存——它们分别落在EXE的.data段、DLL A的.data段、DLL B的.data段里。

