共享内存Segv

时间:2012-02-21 20:26:00

标签: c++ shared-memory sigsegv ipcs

我尝试使用Boost并在3000次分配大小为24的对象后有一个segv,现在我开始使用sys / ipc.h和sys / shm.h,我分配了25 mio字节(如果我理解正确的话) )

它似乎也能在我的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);

        }

1 个答案:

答案 0 :(得分:2)

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

为什么在这里使用sizeof(x)?将一个指向指向x的指针将指向下一个x,而不是下一个字节。我怀疑这是你的问题。

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

++p_sharedMemory;
p_sharedMemory->setTest(i);