Это сводит меня с ума от разочарования. Я просто пытаюсь создать класс буфера совместно используемой памяти, который использует разделяемую память, созданную с помощью 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 ()
(gdb), где
# 0 0x00007fffffe007c5 в __memcpy ()
# 1 0x0000000100000e45 в main (argc = 1, argv = 0x7fff5fbff9d0) в try.cpp: 36
Функциональность настолько проста, я не знаю, что мне не хватает. Любая помощь будет высоко ценится.