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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top