"Attempted to read or write protected memory. This is often an indication that other memory is corrupt."

 


Un post sur l’utilité de la méthode Clear de ICollection 


Voila une exception de type System.AccessViolationException qui peut vous gâcher la vie lorsque vous manipulez des listes. Beaucoup de développeurs DirectX débutants tombent dessus sans savoir que la réponse est toute simple.


I n c o m p r é h e n s i b l e au premier abord.


Si vous regardez sur le net les autres personnes qui sont tombées dessus, soit elles n’y comprennent rien, soit elles tombent sur des gens qui leur donnent des réponses complètement à coté de la plaque (c’est très drôle d’ailleur vous avez des mecs qui tentent de supprimer des processus, d’autres qui placent des Sleep etc. [:D]). Et comme à chaque fois, y’en a que pour ASP.Net cette technologie d’arrière garde et rien pour WinForm DirectX, ou .Net en général.


Voila ce qui se passe pourtant dans la plupart des cas.


Vous avez un VertexBuffer que vous voulez remplir à nouveau de valeurs issues d’une liste générique du type List<CustomVertex.PositionTextured>. Pour remplir c’est simple :


vertexBuffer.SetData(this.vertices.ToArray(), 0, 0);


(ici vertices est notre liste générique). C’est pourtant ici qu’est lancée l’exception. En fait l’erreur vient de la manière dont vous remplissez votre liste générique. Le VertexBuffer a été créé avec une taille fixe qui indique le nombre de vertices qu’il va acceuillir. Or nombre de développeurs DirectX en herbe utilisent les listes générique pour remplir le vertexbuffer. Lorsqu’il faut le remplir de nouvelles valeurs, ils utilisent la meme liste générique, la remplissent à nouveau et appellent SetData. Sauf que … ils n’ont pas appellé la méthode Clear en amont… Résultat, la méthode ToArray renvoie un tableau avec deux fois plus de vertices que le buffer ne peut accepter. Le moteur tente donc d’écrire en dehors du buffer, là ou nous n’y sommes pas autorisé et l’exception est inévitable.


Il faut donc bien veiller à être très stricte dans la manière dont on utilise les collection. Ce ne sont pas des tableaux.


 


 


 

3 thoughts on “"Attempted to read or write protected memory. This is often an indication that other memory is corrupt."

  1. Argl ! enfin merci
    mais c super con 🙁
    ca fait une heure ou plus que je recherche pourquoi j’ai ca. Incroyable j’ai tout testé, j’ai pas pensé à vérifier ce point 🙁

    yeeeeeeeeeeeees !

  2. Bien le bonjour,

    J’ai également cette erreur. Le problème chez moi, c’est que cette erreur est générée lors d’une ouverture d’un document Word. Sous XP, aucun probleme, tout marche très bien. Sous 2k, ca bug. Impossible à lancer l’init du document.

    J’avoue être un peu paumé… si quelqu’un a une idée…

    D’avance merci

  3. Hi here !!

    I have the same error by using a dll to capture images from a camera device. The error occur exactly on the line that is used to do the capture.
    For information, i’m under windows xp. I use visual studio 2005 and the dll is the FRsdk dll of cognitec. Can you help me ?

Leave a Reply

Your email address will not be published. Required fields are marked *