boost :: interprocess :: string缺少一个字符并在破坏时发生分裂

时间:2012-08-20 13:04:33

标签: c++ boost-interprocess

我正在编写一个应用程序,它使用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;

虽然到目前为止这似乎避免了这个问题,但这并不是我想要依赖的解决方案。

1 个答案:

答案 0 :(得分:1)

压缩评论中的信息

  • 升级编译器。不确定提升,但我认为,编译器有什么问题。无论如何,当使用g ++ 4.8.0(实验)/4.7.1和boost 1.51.0时,问题不会发生。如果您无法升级编译器,那么<​​/ li>
  • 设置-O0,-O1或-Os优化器标志(使用g ++ 4.6.3和boost 1.47进行测试)

另外,我读了g ++ man关于Optimizer Options的部分。我试图将-Os禁用的选项与-O2标志组合在一起,但我没有成功。 IMO g ++使用未记录的优化器标志。