跨共享内存共享 std::字符串

Sharing std::string across shared memory

本文关键字:共享 字符串 内存 std      更新时间:2023-10-16

我希望使用共享内存在进程之间共享std::string。但是,我担心字符串对象的分配位置、堆栈或堆上,因为这会影响共享。

提到这一点,MSDN 论坛

。它说:

请注意,在新的 STL(Visual Studio 2003 和 2005)中, std::string 类使用分配字符串的组合变体。如果 长度很长,则字符串在堆区域中分配,但如果 很短,它存储在类的预分配区域中

我不知道字符串可能有多长...我不想为它分配任何固定内存。

我打算做的只是...

wstring somestring;
somestring.sppend(someOtherString); //several times

我想wstring somestring[256]将在堆栈上,所以我可以轻松分享。但是,如果我不希望分配尺寸怎么办?如果大小超过阈值会发生什么?

我希望使用共享内存在进程之间共享 std::string。

不能跨进程边界共享非 POD 类型,尤其是可能在内部分配内存的类型。如果其他进程使用 STL,则无法保证它们使用相同版本的 STL。 即使他们这样做了,他们也会使用不同的内存管理器。

您可以改为分配一个固定长度的char[]数组作为共享内存,并将std::string的字符内容复制到其中。

我想wstring somestring[256]将在堆栈上,所以我可以轻松地分享。

不,你不能。 somestring本身将在堆栈上,但它是std::wstring对象的数组,std::wstring不能共享。

但是,如果我不希望分配尺寸怎么办?如果大小超过阈值会发生什么?

共享内存不是动态大小的。

我赞同Remy Lebeau的回答:一般来说,甚至不要费心考虑这一点。

相关的查询线可能会引导一些读者 https://www.boost.org/doc/libs/1_57_0/doc/html/interprocess/allocators_containers.html,尤其是托管内存段中的 STL 容器部分。 然而,在两个项目中,我们甚至简要地讨论了做这样的事情,我们反而完全按照 Remy 的建议做了!