我正在编写一个应用程序,它使用boost::interprocess
与另一个应用程序通信。但是我在boost::interprocess::string
时遇到了一些问题。从string
创建const 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
销毁destroy_ptr
会导致段错误(这是当我取消注释上面代码中的两个倒数第二行时发生的情况)使用-O3
编译代码(但似乎只有这样)。这种行为的原因是什么?我需要做些什么来避免段错?
我正在使用gcc 4.6.1(编译标志:-std=c++0x -O3 -g
)并在虚拟机(virtualBox)内的linux mint上提升1.47
修改
事实证明,在没有优化的情况下进行编译时,赋值可以正常工作,但在使用-O2
或-O3
进行编译时会表现出所描述的行为。
此外,即使进行了优化,分配仍然有效(至少在这个被修改的示例代码中),如果我这样做了两次,那么相关的代码就像这样:
auto str2 = mem.construct<IpString>("string2")("", mem.get_segment_manager());
*str2 = name;
*str2 = name;
std::cout<<*str<<"|"<<*str2<<std::endl;
虽然到目前为止这似乎避免了这个问题,但这并不是我想要依赖的解决方案。
答案 0 :(得分:1)
压缩评论中的信息
另外,我读了g ++ man关于Optimizer Options
的部分。我试图将-Os禁用的选项与-O2标志组合在一起,但我没有成功。 IMO g ++使用未记录的优化器标志。