0

私は現在、を使用して別のアプリケーションと通信するアプリケーションを作成してい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

では、なぜstr21つの文字が欠落しているのでしょうか。また、この動作を回避するにはどうすればよいでしょうか。

私が抱えているもう1つの問題は、strings使用を破棄しようとするdestroy_ptrと、コードをコンパイルするときにセグメンテーション違反が発生することです(これは、上記のコードの最後から2行目のコメントを外したときに発生します-O3)。その動作の理由は何ですか?また、セグメンテーション違反を回避するために別の方法で何をする必要がありますか?

私はgcc4.6.1(コンパイルフラグ-std=c++0x -O3 -g:)を使用しており、仮想マシン(virtualBox)内のlinuxmintで1.47をブーストしています。

編集:-O2最適化なしでコンパイルすると割り当ては正常に機能しますが、または でコンパイルすると説明されている動作を示し-O3ます。

さらに、割り当ては(少なくともこの考案されたサンプルコードでは)最適化でも機能します。2回実行すると、関連するコードは次のようになります。

auto str2 = mem.construct<IpString>("string2")("", mem.get_segment_manager());
*str2     = name;
*str2     = name;
std::cout<<*str<<"|"<<*str2<<std::endl;

これは今のところ問題を回避しているように見えますが、私が頼りにしたい解決策はほとんどありません。

4

1 に答える 1

1

コメントからの情報を圧縮する

  • コンパイラをアップグレードします。ブーストについてはわかりませんが、コンパイラの問題は何だと思います。とにかく、g ++ 4.8.0(experimental)/4.7.1とboost 1.51.0を使用すると、問題は発生しません。コンパイラをアップグレードできない場合は、
  • -O0、-O1、または-Osオプティマイザーフラグを設定します(g ++ 4.6.3およびブースト1.47でテスト)

また、g++manのセクションを読みましたOptimizer Options。-Osによって無効にされたオプションと-O2フラグを組み合わせようとしましたが、成功しませんでした。IMO g ++は、文書化されていないオプティマイザフラグを使用します。

于 2012-08-23T17:42:21.290 に答える