1

Boost を使用しようとしましたが、サイズ 24 のオブジェクトを 3000 回割り当てた後、segv がありました。今は 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);

        }
4

1 に答える 1

2

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

なぜsizeof(x)ここを使っているのですか?x を指すポインターに 1 を追加すると、次のバイトではなく、次の x が指されます。これはあなたの問題だと思います。

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

++p_sharedMemory;
p_sharedMemory->setTest(i);
于 2012-02-21T20:34:19.067 に答える