2015-07-21 1 views
1

Je souhaite avoir une carte de hachage simultanée en tant que membre de la structure. Je le fais comme ci-dessous:tbb carte de hachage simultanée en tant que membre de la structure

typedef concurrent_hash_map<int, int> Acreaders; 
struct node{ 
    void *obj; 
    int size; // see if required 
    Acreaders acrdr; 
}; 

Alors que je devrais pouvoir accéder à insérer dans la table de hachage comme:

Acreaders::accessor a; 
struct node *n; 
n = (struct node *)malloc(sizeof(struct node)); 
(n->acrdr).insert(a, 5); 

Bien que le programme compile correctement, il conduit à une segmentation faute.

Quel pourrait être le problème? Merci ..

+2

Avez-vous essayé d'écrire votre code en C++? (C'est-à-dire utiliser 'new', par opposition à l'utilisation de fonctions C telles que' malloc'?). Par exemple, actuellement le constructeur de 'n-> acrdr' ne sera jamais appelé, ce qui est probablement la cause de votre segfault. – anderas

Répondre

3

ceedee,

eteras est correct. mallocing *n ne l'initialise pas, mais juste espace alloué pour un node sur le tas. Si vous le faites:

Acreaders::accessor a; 
node nn;    // this constructs nn 
node *n(&nn);   // point n to nn 

(n->acrdr).insert(a, 5); 

Si vous souhaitez allouer dynamiquement node en utilisant spécifiquement malloc, vous pouvez l'initialiser comme ceci:

node *n; 
n = new(malloc(sizeof(node))) node(); // placement new into space 

Cette alloue de l'espace sur le tas avec malloc, et construit le noeud en cet espace avec l'emplacement new. Dans ce cas, vous devez appeler le destructor avant de libérer l'espace:

n->~node(); // destructor frees any additional structures used by node 
free(n); 

Ou comme anderas décrit, vous pouvez juste dire

n = new node(); 

et après que vous avez terminé, appelez

delete n; 

Vous devez toujours utiliser new de préférence à malloc avec C++ (et TBB est une bibliothèque C++.) Voir In what cases do I use malloc vs new?