私は現在、を使用して別のアプリケーションと通信するアプリケーションを作成してい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
1つの文字が欠落しているのでしょうか。また、この動作を回避するにはどうすればよいでしょうか。
私が抱えているもう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;
これは今のところ問題を回避しているように見えますが、私が頼りにしたい解決策はほとんどありません。