【问题标题】:Shared Memory Segv共享内存 Segv
【发布时间】:2012-03-12 04:20:11
【问题描述】:

我尝试使用 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);

        }

【问题讨论】:

  • 只是出于好奇,setTest 电话是什么?是不是和Boost有关?

标签: c++ shared-memory segmentation-fault ipcs


【解决方案1】:

(p_sharedMemory + (sizeof(x) * i))-&gt;setTest(i);

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

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

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

【讨论】:

  • 嗨 JimR 感谢您的快速回复。我已经检查了您的提示,实际上很酷,它有效!现在,如果我可以问有什么区别?我认为这将完全相同。感谢您给我一个网址或解释,所以我不了解背景。
  • 当您使用指针进行数学运算时,例如 '++pointer`,指针会增加 sizeof( *pointer ) 而不是 1 个字节。这是decent explanation
  • 现在我知道我实际上跳了 24 * type x 而不是 24 字节,非常感谢 JimR
猜你喜欢
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多