DLL导入导出STL类对象导致崩溃的问题
2012-01-10 09:43
375 查看
[b]问题:[/b]
从某DLL中导出一个接口函数GetDirFileIdSet用于获取目录下所有文件的ID集合。函数声明如下,该函数传入一个std::set<UINT>类对象:
void GetDirFileIdSet(std::set<UINT>& rFileIdSet);
当在VS2008中编译的“数据文件编辑器”加载了在VC6中编译的DLL,并调用到GetDirFileIdSet时发生了崩溃。
[b]原因:[/b]
在不同的DLL或EXE中通过指针或引用操作另一个DLL或EXE中的STL类对象时,会遇到严重的程序错误,包括数据错乱或丢失。
标准C++库的多数类直接或间接的使用了静态数据成员。由于这些类是通过模板创建实例的,所以每个可执行模块(DLL或EXE)包含了有关类静态数据成员的一份Copy。当STL类中的函数成员要求操作静态数据成员时,这个类操作的静态数据是此函数成员代码所在的执行模块中的数据。由于静态成员数据在可执行模块间不能保证同步,所以前面提到的操作会导致读取失败或数据混乱和丢失。
[b]解决方法:[/b]
1. 在创建STL类对象的模块中导出读取函数。这些函数包装了STL类对象要求的功能。这样,STL类对象只在原模块中被读取。例如:假设Program.exe需要得到Library.dll内std::deque<UINT>类对象中的一个元素,Library.dll则要导出读取函数:
__declspec(dllexport) UINT GetItem(UINT unIndex);
Program.exe就可以调用此函数来得到队列的一个元素了。
2. 从一个模块中导出模板实例,在另一个模块中导入此实例。例如:Library.dll将std::map<int, MyClass>指针传给Program.exe中的一个函数,需要在Library.dll中导出MyClass类定义和std::map<int, MyClass>类定义。然后就可以类似这样调用:
std::map<int, MyClass> *pTheMap = GiveMeTheMap();
const MyClass* pszItem = GetTheMapItemX(pTheMap, x);
从某DLL中导出一个接口函数GetDirFileIdSet用于获取目录下所有文件的ID集合。函数声明如下,该函数传入一个std::set<UINT>类对象:
void GetDirFileIdSet(std::set<UINT>& rFileIdSet);
当在VS2008中编译的“数据文件编辑器”加载了在VC6中编译的DLL,并调用到GetDirFileIdSet时发生了崩溃。
[b]原因:[/b]
在不同的DLL或EXE中通过指针或引用操作另一个DLL或EXE中的STL类对象时,会遇到严重的程序错误,包括数据错乱或丢失。
标准C++库的多数类直接或间接的使用了静态数据成员。由于这些类是通过模板创建实例的,所以每个可执行模块(DLL或EXE)包含了有关类静态数据成员的一份Copy。当STL类中的函数成员要求操作静态数据成员时,这个类操作的静态数据是此函数成员代码所在的执行模块中的数据。由于静态成员数据在可执行模块间不能保证同步,所以前面提到的操作会导致读取失败或数据混乱和丢失。
[b]解决方法:[/b]
1. 在创建STL类对象的模块中导出读取函数。这些函数包装了STL类对象要求的功能。这样,STL类对象只在原模块中被读取。例如:假设Program.exe需要得到Library.dll内std::deque<UINT>类对象中的一个元素,Library.dll则要导出读取函数:
__declspec(dllexport) UINT GetItem(UINT unIndex);
Program.exe就可以调用此函数来得到队列的一个元素了。
2. 从一个模块中导出模板实例,在另一个模块中导入此实例。例如:Library.dll将std::map<int, MyClass>指针传给Program.exe中的一个函数,需要在Library.dll中导出MyClass类定义和std::map<int, MyClass>类定义。然后就可以类似这样调用:
std::map<int, MyClass> *pTheMap = GiveMeTheMap();
const MyClass* pszItem = GetTheMapItemX(pTheMap, x);
相关文章推荐
- ios开发使用cocoapods倒入一堆的三方库之后开始崩溃了。发觉是导入极光引用的iOS10UserNotifications.framework导致的问题 Reason: image not found
- oracle impdp将导出用户的所有对象导入至另一个用户下,生成的触发器语句问题处理
- google与outlook的通讯录导入导出时,语言差异导致的字段映射问题
- PHPEXCEL导入数据库,执行到load导致系统崩溃问题
- ios开发使用cocoapods倒入一堆的三方库之后开始崩溃了。发觉是导入极光引用的iOS10UserNotifications.framework导致的问题 Reason: image not found
- 规避QT4.8.5版本下ocx(dll的情况下)使用QNetworkAccessManager导致程序退出时产生的崩溃问题
- DLL中导出全局变量的方法及导入时需要注意的问题
- 全量导入数据 导致solr内存溢出 崩溃问题解决
- 服务器更新dll后导致网站崩溃,重启iis也无效的一种解决方案(downmoon)
- DLL 的导入与导出
- 显示调用DLL 应该注意DLL导出函数的调用约定问题
- MFC项目使用webbrowser控件,点击载入的页面里的文件下载链接后导致程序的崩溃问题的解决方案
- DllMain中不当操作导致死锁问题的分析--加载卸载DLL与DllMain死锁的关系
- 类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们的问题的解决方法
- JSONKit 解析后存在NSULL对象导致的Crash问题处理
- 使用sqoop导入导出mysql、hdfs、hive出现的问题
- 智能提示导致Visual Studio 2010崩溃问题
- DLL导出、导入
- C#调用mfc写的Dll出现调用导致堆栈不对称问题
- Dll导出对话框导致内存泄露