проблема с memcpy из разделяемой памяти в boost.interprocess

Это сводит меня с ума от разочарования. Я просто пытаюсь создать класс буфера общей памяти, который использует общую память, созданную с помощью 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;
}

Когда я запускаю это, он записывает данные в порядке, но segfaults на первом memcpy в цикле чтения. gdb говорит следующее:

Программа получила сигнал EXC_BAD_ACCESS, не удалось получить доступ к памяти. Причина: KERN_INVALID_ADDRESS по адресу: 0x0000000000000000 0x00007fffffe007c5 в __memcpy()

(ГДБ) где

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

Функциональность настолько проста, что я не знаю, чего мне не хватает. Любая помощь будет высоко ценится.


person recipriversexclusion    schedule 03.03.2010    source источник


Ответы (2)


data ни на что не указывает. (Убедитесь, что программа компилируется со всеми включенными предупреждениями.) Похоже, что в любом случае это не должен быть указатель.

Второй цикл, возможно, должен быть:

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++;
}
person Community    schedule 03.03.2010
comment
(краснеет), это точно заставляет меня чувствовать себя тупой! Кажется, я страдаю от TIQL (временной потери IQ) (надеюсь это временно). Спасибо! - person recipriversexclusion; 04.03.2010

Я не могу проверить это здесь, потому что у меня нет boost, но у меня есть предположение. В этом пример, объект shared_memory_object сначала используется для записи с флагом create_only.

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

Затем он читается вторым объектом shared_memory_object с флагом open_only:

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

Кажется, вам нужно изменить свой shared_memory_object на правильный флаг.

person fogo    schedule 03.03.2010