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

时间:2013-12-17 23:44:32

标签: c++ dll c++11 std wchar

根据一些较旧的StackOverflow问题(Unable to pass std::wstring across DLLC++ 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吗?为什么或为什么不呢?

1 个答案:

答案 0 :(得分:6)

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

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

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

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