我目前正在编写一个应用程序,它使用boost::interprocess
. 但是我有一些问题boost::interprocess::string
。string
从 a中创建 aconst char*
就像预期的那样,但是当我尝试创建一个空字符串并稍后用适当的内容填充它时(因为我在创建字符串时不知道它)它以某种方式丢失了第一个字符。以下示例代码说明了这种行为:
#include <iostream>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/string.hpp>
namespace ip = boost::interprocess;
int main(int ac, char* av[]){
typedef ip::allocator<char,ip::managed_shared_memory::segment_manager> IpStringAllocator;
typedef ip::basic_string<char, std::char_traits<char>,IpStringAllocator> IpString;
const char* name = "SharedMem";
ip::shared_memory_object::remove(name);
ip::managed_shared_memory mem(ip::create_only ,name ,65536);
auto str = mem.construct<IpString>("string")(name, mem.get_segment_manager());
auto str2 = mem.construct<IpString>("string2")("", mem.get_segment_manager());
*str2 = name;
std::cout<<*str<<"|"<<*str2<<std::endl;
//mem.destroy_ptr<IpString>(str);
//mem.destroy_ptr<IpString>(str2);
return 0;
}
此应用程序的输出是SharedMem|haredMem
,所以str
保持SharedMem
,正如预期的那样。但是str2
只包含haredMem
,缺少字符串的第一个字符。
那么为什么str2
缺少一个字符,我该如何避免这种行为呢?
我遇到的另一个问题是,在编译代码时尝试销毁strings
usingdestroy_ptr
会导致段错误(这就是我在上面的代码中取消注释倒数第二行时发生的情况)-O3
(但似乎只有这样)。这种行为的原因是什么,我需要做些什么来避免段错误?
我在-std=c++0x -O3 -g
虚拟机(virtualBox)内的 linux mint 上使用 gcc 4.6.1(编译标志:)和 boost 1.47
编辑:
事实证明,在没有优化的情况下编译时分配工作正常,但在使用-O2
or编译时表现出所描述的行为-O3
。
此外,即使进行优化,分配也有效(至少在这个人为的示例代码中),如果我做两次,使相关代码看起来像这样:
auto str2 = mem.construct<IpString>("string2")("", mem.get_segment_manager());
*str2 = name;
*str2 = name;
std::cout<<*str<<"|"<<*str2<<std::endl;
虽然到目前为止这似乎避免了这个问题,但它几乎不是我想要依赖的解决方案。