根据一些较旧的StackOverflow问题(Unable to pass std::wstring across DLL,C++ DLL returning pointer to std::list<std::wstring>),C ++ DLL返回std::wstring
并不安全,因为无法保证主程序具有相同的定义std::wstring
因此可能会导致崩溃。
但是,在http://en.cppreference.com/w/cpp/string/basic_string中,似乎std::wstring
现在可以与WCHAR
数组互换使用:
(自C ++ 11以来) basic_string的元素是连续存储的,即对于basic_string s,&amp; *(s.begin()+ n)==&amp; * s.begin()+ n对于[0,s中的任何n]。 size()),或者等效地,指向s [0]的指针可以传递给期望指向CharT []数组的第一个元素的指针的函数。
我已经通过将&s[0]
传递给期望WCHAR*
缓冲区的WINAPI函数来测试了这一点,它似乎正常工作(std::wstring
已正确填充了WINAPI的结果) 。因此,由于std::wstring
现在显然可以像WCHAR
数组一样对待,所以我决定重新审视这个问题:可以从DLL安全地返回std::wstring
吗?为什么或为什么不呢?
答案 0 :(得分:6)
在跨越DLL边界传递C ++对象方面没有任何改变。由于与以前相同的原因,仍然不允许这样做。边界另一侧的模块可能有不同的类定义。
&s[0]
是指向字符数组的有效可修改指针的事实并不真正相关。因为std::basic_string
不仅仅是一个字符数组。
请记住std::basic_string
的每个实现都可以有不同的内部存储空间。 operator[]
可以有不同的实现。可以分配到不同的堆。等等。
我认为可以安全地假设在通用DLL边界之间传递C ++对象永远不会有效。只有在保证边界的两边都链接到同一个运行时实例时才可行。