2012-02-21 156 views
1

我试图使用Boost和3000分配大小为24的对象后有一个segv,现在我开始使用sys/ipc.h和sys/shm.h,我分配了25 mio字节(如果我明白这个正确)共享内存段

似乎也对我的Linux嵌入式工控机正常工作-m将显示分配的段

0x000081bc 917516  testUser 644  25000000 0 

的sysctl -p将打印

kernel.shmmax = 25500000 

出于某种原因,它的工作原理直到th e程序达到“43406 x 24字节”,这就是它将分割的地方。我很乐意在问题出现的地方得到一些提示。如果这是分配和使用共享内存与对象的错误方式,请注意。

#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); 

     } 
+0

只是出于好奇,什么是'setTest'打电话?这与Boost有关吗? – 2012-02-21 21:10:45

回答

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); 
+0

嗨JimR感谢您的快速回复。我检查了你的提示,实际上它很酷!现在,如果我可能会问有什么区别?我认为这将是完全一样的。感谢您给我一个网址或一个解释,让生病得到背景。 – 2012-02-21 20:38:51

+0

当你用一个指针(如'++指针')进行数学运算时,指针通过sizeof(*指针)而不是1个字节增加。这是一个[体面的解释](http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/pointer.html) – JimR 2012-02-21 20:43:03

+0

现在我明白我实际上跳过24 *类型x而不是24字节,非常感谢JimR – 2012-02-21 20:53:22