从DLL返回std :: wstring是否安全?

cf *_*ica 5 c++ dll std wchar c++11

根据一些较旧的StackOverflow问题(无法通过DLL传递std :: wstring,C++ DLL返回指向std :: list <std :: wstring>的指针),对于C++ DLL返回a并不安全,std::wstring因为不能保证main程序具有相同的定义,std::wstring因此可能导致崩溃.

但是,在http://en.cppreference.com/w/cpp/string/basic_string中,它现在似乎std::wstring可以与WCHAR数组互换使用:

(从C++ 11开始)basic_string的元素是连续存储的,也就是说,对于basic_string s,&*(s.begin()+ n)==&*s.begin()+ n对于任何n in [0,s.size()),或者,等效地,指向s [0]的指针可以传递给期望指向CharT []数组的第一个元素的指针的函数.

我已经通过传递&s[0]给期望WCHAR*缓冲区的WINAPI函数测试了它,它似乎工作(std::wstring正确填充了WINAPI的结果).所以既然std::wstring现在显然可以像对待WCHAR数组一样对待,我决定重新审视这个问题:可以std::wstring从DLL中安全地返回吗?为什么或者为什么不?

Dav*_*nan 6

关于跨越DLL边界传递C++对象没有任何改变.由于与以前相同的原因,仍然不允许这样做.边界另一侧的模块可能具有不同的类定义.

事实&s[0]是一个有效的可修改指向字符数组的指针并不真正相关.因为a std::basic_string不仅仅是一个字符数组.

请记住,每个实现都std::basic_string可以有不同的内部存储.可以有不同的实现operator[].可以分配到不同的堆.等等.

我认为可以安全地假设在通用DLL边界之间传递C++对象永远不会有效.只有在保证边界的两边都链接到同一个运行时实例时才可行.