J'ai une classe modèle appelée OrdinalObjectList qui est simplement une carte avec une clé de pointeurs int et object. Son but est de fournir une collection de pointeurs d'objets accessibles par une clé ordinale. Voici la classe:EXC_BAD_ACCESS lors de la tentative de suppression du pointeur valide (xcode C++)
template <typename O>
class OrdinalObjectList {
public:
std::map<int, O*> List;
OrdinalObjectList() {};
virtual ~OrdinalObjectList()
{
// Need to delete the objects in the map
typename std::map<int, O*>::iterator i;
for (i = List.begin(); i != List.end(); i++)
{
O* d = i->second;
delete d;
}
};
sur la destruction du OrdinalObjectList, les boucles destructor à travers la carte et supprime les objets. Cela a bien fonctionné jusqu'à présent, mais il reçoit actuellement une erreur EXC_BAD_ACCESS lors de la suppression du deuxième des deux objets de la collection.
Sur le premier passage d est 'FSCE :: Client' * 0x10088e600 qui supprime est sans problème. Sur la deuxième passe, d est 'FSCE :: Customer' * 0x100897e00 qui, lorsque supprime 'd provoque l'EXC_BAD_ACCESS. Je peux accéder aux membres du second 'd' dans le débogueur. c'est-à-dire d-> lifeid int 2, indiquant que l'objet FSCE :: Customer est un objet valide et que 'd' est un pointeur valide.
Quelles sont les étapes à suivre pour déterminer la cause de EXC_BAD_ACCESS?
Exécutez le code en utilisant un outil destiné à détecter l'accès après libre, comme 'valgrind'. Très probablement, une opération précédente malloc/free/new/delete est en train de corrompre le tas, provoquant l'échec de cette suppression. –
Je le fais maintenant. Valgrind pour OSX n'est pas complet, mais je vais voir ce qu'il doit rapporter. Je devrais également noter que l'erreur ne se produit pas si j'exécute le programme monothread, il se produit seulement après le traitement multi-thread. Je me demande si les threads de traitement ne se sont pas détachés correctement et bloquent l'objet. –