std::wstring跨dll 崩溃

今天用个测试exe调用了个dll,有个接口返回std::wstring,经调试发现挂在该函数return之后,怀疑是string不适合作为返回值,百度一番发现下面这篇解释的很详细。

STL跨平台调用会出现很多异常,你可以试试.

STL使用模板生成,当我们使用模板的时候,每一个EXE,和DLL都在编译器产生了自己的代码,导致模板所使用的静态成员不同步,所以出现数据传递的各种问题,下面是详细解释。

原因分析:

一句话-----如果任何STL类使用了静态变量(无论是直接还是间接使用),那么就不要再写出跨执行单元访问它的代码。 除非你能够确定两个动态库使用的都是同样的STL实现,比如都使用VC同一版本的STL,编译选项也一样。强烈建议,不要在动态库接口中传递STL容器!!

STL不一定不能在DLL间传递,但你必须彻底搞懂它的内部实现,并懂得为何会出问题。

std::map std::set mfc的CMap在VC6下也有类似问题。 据说有的开发环境没问题。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-03 22:16:55

std::wstring跨dll 崩溃的相关文章

宽字符std::wstring的长度和大小问题?sizeof(std::wstring)是固定的32,说明std::wstring是一个普通的C++类,而且和Delphi不一样,没有负方向,因为那个需要编译器的支持

std::wstring ws=L"kkkk";    int il=ws.length();    int ia=sizeof(ws);    int ib=sizeof("dddd");    int ic=sizeof(L"kkkk");输出为    il=4,ia=32,ib=5,ic=10为什么ia=32 ?wstring到底对L"kkkk"做了什么? http://www.debugease.com/vc/2171

QString与中文,QString与std::wstring的相互转换(使用fromStdWString和u8关键字)

Qt版本:5.5.1 Qt的QString功能丰富,对非英语语言的支持也不是问题,但支持得不够直接.例如,像 ? 1 QString str("死亡使者赛维"); 这样直接用带中文的字符串进行构造,那么用QMessageBox显示str时将出现乱码.如果使用fromLocal8Bit.fromLatin1这样的函数,又依赖本地计算机的显示语言,所以它们不是好方法. 显式地使用宽字符(wchar_t)或UTF-8才是好方法. ? 1 2 QString str0(QString::fro

virsual studio 2008 跨dll释放内存,堆指针无效问题

运行时 触发了virsual studio的assert断点.输出内容如下: HEAP[xx.exe]: Invalid Address specified to RtlValidateHeap( 00C80000, 00CACFFC )Windows 已在 xx.exe 中触发一个断点. 其原因可能是堆被损坏,这说明 xx.exe 中或它所加载的任何 DLL 中有 Bug. 原因也可能是用户在 xx.exe 具有焦点时按下了 F12. 经过屏蔽最近的修改内容,逐渐找到原因是 传递的一个结构体中

QString与std::wstring的转换问题

问题描述: 在qt工程中调用QString::fromStdWString()时,老是报错error LNK2019: 无法解析的外部符号...QString::fromStdWString(...)... 原因: 在Qt库中 wchar_t 不是内置类型,所以QT建议我们构建基于Qt的软件时,也不要将 wchar_t 作为内置类型.但是在一些情况下,其他的库构建时可能已经将 wchar_t 作为了内置类型.当使用 std::wstring.QString::toStdWString()和 QS

对std::string和std::wstring区别的解释,807个赞同,有例子

807down vote string? wstring? std::string is a basic_string templated on a char, and std::wstring on a wchar_t. char vs. wchar_t char is supposed to hold a character, usually a 1-byte character. wchar_t is supposed to hold a wide character, and then,

std::wstring std::string w2m m2w

static std::wstring m2w(std::string ch, unsigned int CodePage = CP_ACP) { if (ch.empty())return L""; std::wstring ret; DWORD dwOutSize = 0; dwOutSize = MultiByteToWideChar(CodePage, 0, ch.c_str(), -1, NULL, 0); ret.resize(dwOutSize - 1); MultiBy

一个全局变量引起的DLL崩溃

参考我发的帖子: http://bbs.csdn.net/topics/390737064?page=1#post-397000946 现象是exe程序在加载dll的时候崩溃了,莫名其妙的崩溃了.换其它DLL没问题,我又写了个DEMO程序使用这个DLL也是一个现象,用OD加载EXE,用ODDLLLOADER加载DLL,结果也是一样的崩..搞的我也差点崩溃了.. 加载上微软符号表后发现: 然后自然而然的一个一个内核函数去查找去找可能,百度谷歌都翻了,看雪论坛也看了. 法个克,这个问题找了很长时间.

std::vector传递dll参数异常-长度超限

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源) 如果你调用dll中的函数,使用了vector传递参数时,报错"vector的size异常,长度超限" 代码位置 "_THROW(length_error, "vector<T> too long")" 那么你可能遇到了vector的debug版与release版不匹配问题. 在未作条件编译情况下,如果: 1.       调

MFC exe使用C++ dll中的std::string 崩溃

VC6中 MFC exe中 new 纯C++ dll dll 崩溃 我把纯C++的 dll,用/MTd 换成/MDd,就可以了 版权声明:本文为博主原创文章,未经博主允许不得转载.