2017-08-04 1 views
0

Nous avons une classe où nous déclarons boost::lockfree::queue en tant que membre de données static et remplacer l'opérateur new et delete. La logique dans l'opérateur new/delete est de créer une instance de classe pour obtenir/mettre un pointeur d'un objet dans la file d'attente.boost :: lockfree :: queue en tant que membre de données statiques

Le problème est qu'après que les cas de test se termine ce qui est réussi, j'obtiens une erreur de segment. Si je commente l'instruction delete arr[i], la panne ne se produit plus. Mon hypothèse est que la file d'attente Boost est statique, donc le membre de données sera détruit en dernier ou son propre destructeur sera appelé quand le programme doit se terminer mais je ne suis pas sûr de ce qui est dans son destructeur qui provoque l'abandon ou donne un défaut de segmentation.

Des pointeurs seraient-ils vraiment utiles pour résoudre le problème?

Répondre

2

Vous devez savoir que operator new et new expression (par exemple new B()) sont différentes. La nouvelle expression invoque le operator new correspondant, puis le constructeur de l'objet. Le travail de operator new est de retourner la mémoire non initialisée, l'objet n'existe pas à ce stade.

Lorsque vous appelez f->initialize(); dans l'implémentation operator new, cet appel est suivi par le constructeur de l'objet, qui doit initialiser la mémoire de tous les objets.

En d'autres termes, vous ne pouvez mettre en œuvre la mémoire cache dans operator new, pas cache d'objets.

Si vous voulez un cache d'objets, vous devez utiliser une fabrique (modèle de conception d'usine). Pour commencer, consultez le boost::pool.