Je reçois une mauvaise erreur. Quand j'appelle supprimer sur un objet en haut d'une hiérarchie d'objets (en espérant à la cause de la suppression de ses objets enfants), mon progamme quitte et je reçois ceci:Questions sur l'allocation de mémoire C et supprimer
*** glibc detected *** /home/mossen/workspace/abbot/Debug/abbot: double free or corruption (out): 0xb7ec2158 ***
suivi de ce qui ressemble à une décharge de la mémoire de quelques sortes. J'ai recherché cette erreur et de ce que je comprends, il semble se produire lorsque vous essayez de supprimer la mémoire qui a déjà été supprimé. Impossible car il n'y a qu'un seul endroit dans mon code qui tente cette suppression. Voici la partie farfelue: elle ne se produit pas en mode débogage. Le code en question:
Terrain::~Terrain()
{
if (heightmap != NULL) // 'heightmap' is a Heightmap*
{
cout << "heightmap& == " << heightmap << endl;
delete heightmap;
}
}
J'ai commenté tout le destructor heightmap, et encore cette erreur. Lorsque l'erreur se produit,
heightmap& == 0xb7ec2158
est imprimé. En mode débogage, je peux parcourir le code lentement et
heightmap& == 0x00000000
est imprimé, et il n'y a pas d'erreur. Si je commente le 'delete heightmap'; ligne, l'erreur ne se produit jamais. Le destructeur ci-dessus est appelé à partir d'un autre destructeur (classes séparées, pas de destructeurs virtuels ou quelque chose comme ça). Le pointeur heightmap est new'd dans une méthode comme ceci:
Heightmap* HeightmapLoader::load() // a static method
{
// ....
Heightmap* heightmap = new Heightmap();
// ....other code
return heightmap;
}
Se pourrait-il quelque chose à voir avec le retour d'un pointeur qui a été initialisé dans l'espace de la pile d'une méthode statique? Est-ce que je fais la suppression correctement? D'autres conseils sur ce que je pourrais vérifier ou faire mieux?
Oui, c'était ça. Je pensais que heightmap * était en train d'être défini (pas dans le constructeur, mais dans une méthode setter), hélas ce n'était pas le cas. Merci, Greg! – Mossen
Toujours initialiser tous vos pointeurs pendant la construction. Un pointeur nul peut être supprimé en toute sécurité (no-op). Si votre constructeur a placé le pointeur sur 0 dans la liste d'initialisation, le code sera correct dès le début. –
Et bien sûr il pourrait y avoir une construction de copie et/ou une assignation qui fait pointer deux objets vers la même zone mémoire ... –