Сегмент общей памяти

Я пытался использовать Boost и имел segv после 3000 выделений объектов размером 24, теперь я начал использовать sys/ipc.h и sys/shm.h, я выделяю 25 миллионов байт (если я правильно понимаю)

кажется, он также работает правильно на моем Linux-боксе ipcs -m покажет выделенный сегмент

0x000081bc 917516     testUser 644        25000000   0

sysctl -p напечатает

kernel.shmmax = 25500000

По какой-то причине это работает до тех пор, пока программа не достигнет «43406 x 24 байта», это то место, где она будет segv. Я был бы рад получить некоторые подсказки, в чем заключается моя проблема. Также обратите внимание, если это неправильный способ выделения и использования общей памяти с объектами.

#define MAXMYMEM 25000000
int sharedMemId;
x *p_sharedMemory;
x *p_other;
sharedMemId = shmget(2232, MAXMYMEM, IPC_CREAT | 0644);

if(sharedMemId >= 0){

    p_sharedMemory = (x*) shmat( sharedMemId, 0 , 0);

    if(p_sharedMemory != ( x *)-1) {

        cout << sizeof(x) << endl;

        for(unsigned int i = 0 ; i < 1000000;i++ ){



            (p_sharedMemory + (sizeof(x) * i))->setTest(i);

        }

person Oliver    schedule 21.02.2012    source источник
comment
Просто из любопытства, что это за setTest звонок? Это что-то связанное с Boost?   -  person Mark Wilkins    schedule 22.02.2012


Ответы (1)


(p_sharedMemory + (sizeof(x) * i))->setTest(i);

Почему вы используете sizeof(x) здесь? Добавление единицы к указателю, указывающему на x, будет указывать на следующий x, а не на следующий байт. Я подозреваю, что это ваша проблема.

изменить (p_sharedMemory + (sizeof(x) * i))->setTest(i); на

++p_sharedMemory;
p_sharedMemory->setTest(i);
person JimR    schedule 21.02.2012
comment
Привет, ДжимР, спасибо за быстрый ответ. Я проверил вашу подсказку, на самом деле круто работает! Теперь, если я могу спросить, в чем разница? Я предполагал, что это будет точно так же. Спасибо, что дали мне URL-адрес или объяснение, так что я плохо понимаю фон. - person Oliver; 22.02.2012
comment
Когда вы выполняете математические операции с указателем, например «++pointer», указатель увеличивается на sizeof(*pointer), а не на 1 байт. Вот достойное объяснение - person JimR; 22.02.2012
comment
Теперь я понимаю, что на самом деле я перепрыгнул через 24 * type x вместо 24 байт, большое спасибо JimR - person Oliver; 22.02.2012