En utilisant le pointeur de suppression de std :: liste?
-
28-10-2019 - |
Question
Dans mon programme, j'ai un pointeur vers un objet std::list
, il est affecté comme ainsi.
d_list_p = new std::list<some_type*>();
Puis, plus tard dans mon programme, je le supprimer souhaiterai.
d_list_p->clear();
delete d_list_p;
Pour une raison quelconque, je reçois un point d'arrêt de Windows déclenché sur l'instruction delete. Si je casse à l'instruction delete je vois que la liste existe et a une taille de 0. En outre, je n'ajoute un élément à la liste pour le cas qui renvoie une erreur (je pense).
Le code est compilé avec le compilateur de la MS VC pour VS2005.
Le message d'erreur indique de Windows a déclenché un point d'arrêt indiquant la corruption de la mémoire. La trace de la pile dit ce qui suit.
ntdll.dll!DbgBreakPoint()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!RtlpNtMakeTemporaryKey() + 0x6735 bytes
ntdll.dll!RtlpNtMakeTemporaryKey() + 0x6b72 bytes
ntdll.dll!RtlpNtMakeTemporaryKey() + 0x7d5a bytes
ntdll.dll!LdrAlternateResourcesEnabled() + 0x33bd bytes
ntdll.dll!RtlpUnWaitCriticalSection() + 0x65b bytes
msvcr80.dll!free() + 0xcd bytes
FM_Access_Library_NET.dll!std::list<FM_Access_Library::Logger_Callbacks *,std::allocator<FM_Access_Library::Logger_Callbacks *> >::`scalar deleting destructor'() + 0x20 bytes C++
Il est sans doute mentionner la valeur que cette déclaration de suppression est dans le code C qui est en cours de construction dans une DLL .NET, de sorte que le programme est en cours d'exécution en mode mixte.
La solution
est d_list_p
un membre d'une classe? Et, est-ce que la classe d'observer la Règle de trois ?
Sinon, (une copie) d_list_p
peut-être déjà été supprimé.
Autres conseils
Vous devez itérer votre liste et de supprimer tous les pointeurs individuels aussi, parce que vous les fuites si vous ne le faites pas.
Et pourquoi êtes-vous créer un pointeur vers std :: liste? juste utilisation std::list<mytype> mylist;
de Windows doublechecks le tas lorsque vous appelez delete
, et ainsi la ligne de delete
est trouver l'erreur, ne pas créer. L'erreur est dans les lignes ci-dessus.
La plupart corruption du tas est causée par (A) appelant suppression trop de fois (B) appeler la mauvaise forme de suppression, ou (C) l'accès à un tableau de tas alloué hors limites. Nous pouvons voir que A et B ne sont pas la question, il est probablement C. Trouver des accès de tableau, et les entourer pour valider les affirme gammes.