SEGV de mémoire partagée
-
28-10-2019 - |
Question
J'ai essayé d'utiliser Boost et j'ai eu un SEGV après 3000 allocations d'objets de taille 24, maintenant j'ai commencé à utiliser SYS / IPC.H et SYS / SHM.H, j'alloue 25 octets Mio (si je comprends bien)
Il semble également fonctionner correctement sur ma boîte Linux IPCS -M affichera le segment alloué
0x000081bc 917516 testUser 644 25000000 0
sysctl -p imprimera
kernel.shmmax = 25500000
Pour une raison quelconque, cela fonctionne jusqu'à ce que le programme atteigne "43406 x 24 octets" C'est l'endroit où il sera. Je serais heureux d'obtenir des indices où réside mon problème. Veuillez également noter si c'est la mauvaise façon d'allouer et d'utiliser la mémoire partagée avec des objets.
#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);
}
La solution
(p_sharedMemory + (sizeof(x) * i))->setTest(i);
Pourquoi utilisez-vous sizeof(x)
ici? L'ajout d'un pointeur qui pointe vers un X pointera au prochain x, pas l'octet suivant. Je soupçonne que c'est votre problème.
monnaie (p_sharedMemory + (sizeof(x) * i))->setTest(i);
à
++p_sharedMemory;
p_sharedMemory->setTest(i);