2012-02-21 265 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