2

これは私を欲求不満に駆り立てています。データの読み取り/保存ができる Boost.Interprocess を通じて作成された共有メモリで使用する共有メモリ バッファ クラスを作成しようとしています。機能をテストするために次のように書きました

#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <iostream>
using namespace std;
using namespace boost::interprocess;

int main( int argc, char* argv[] ) {
    shared_memory_object::remove( "MyName" );
    // Create a shared memory object
    shared_memory_object shm ( create_only, "MyName", read_write );
    // Set size for the shared memory region
    shm.truncate(1000);
    // Map the whole shared memory in this process
    mapped_region region(shm, read_write);
    // Get pointer to the beginning of the mapped shared memory region
    int* start_ptr;
    start_ptr = static_cast<int*>(region.get_address());

    // Write data into the buffer
    int* write_ptr = start_ptr;
    for( int i= 0; i<10; i++ ) {
        cout << "Write data: " << i << endl;
        memcpy( write_ptr, &i, sizeof(int) );
        write_ptr++;
    }

    // Read data from the buffer
    int* read_ptr = start_ptr;
    int* data;
    for( int i= 0; i<10; i++ ) {
        memcpy( data, read_ptr, sizeof(int) );
        cout << "Read data: " << *data << endl;
        read_ptr++;
    }

    shared_memory_object::remove( "MyName" );
    return 0;
}

これを実行すると、データは正常に書き込まれmemcpyますが、読み取りループの最初でセグメンテーション違反が発生します。gdb は次のように述べています。

プログラムは信号 EXC_BAD_ACCESS を受信しました。メモリにアクセスできませんでした。理由: __memcpy () のアドレス: 0x0000000000000000 0x00007fffffe007c5 の KERN_INVALID_ADDRESS

(gdb) ここで

#0 0x00007fffffe007c5 in __memcpy () #1 0x0000000100000e45 in main (argc=1, argv=0x7fff5fbff9d0) at try.cpp:36

機能はとてもシンプルで、何が欠けているのかわかりません。どんな助けでも大歓迎です。

4

2 に答える 2

6

data何かを指すように設定されていません。(プログラムがすべての警告を有効にしてコンパイルされていることを確認してください。) とにかくポインタであってはならないようです。

2 番目のループは次のようになります。

int* read_ptr = start_ptr;
int data;
for( int i= 0; i<10; i++ ) {
    memcpy( &data, read_ptr, sizeof(int) );
    cout << "Read data: " << data << endl;
    read_ptr++;
}
于 2010-03-03T18:20:12.710 に答える
0

利用できないため、ここでテストすることはできませんがboost、推測はできます。このでは、shared_memory_objectオブジェクトは最初にフラグを使用して書き込むために使用されますcreate_only

shared_memory_object shm (create_only, "MySharedMemory", read_write);

次にshared_memory_object、フラグ付きの2番目のオブジェクトで読み取られopen_onlyます。

shared_memory_object shm (open_only, "MySharedMemory", read_only);

shared_memory_object適切なフラグに変更する必要があるようです。

于 2010-03-03T18:26:54.683 に答える