Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Heapfehlercorruption

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.02.2015, 18:39 Uhr
~Underfaker
Gast


Hallo zusammen,

ich habe aktuell einen Fehler in meinem Programm der da lautet:

"HEAP CORRUPTION DETECTED: after Normal block (#21) at 0x0000000037DEC0.
CRT detected that the application wrote to memory after end of heap buffer."

Ich weiß leider nichts mit dieser Fehlermeldung anzufangen, sie kommt auch erst nachdem ich schon viele Iterationen durch denselben Programmcode durchlaufen habe.

Kann mir jemand erklären worum es gehen könnte, bzw. wie ich ausfindig mache welche Codestelle(n) dafür verantwortlich sind?

Vielen Dank im Voraus und beste Grüße
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.02.2015, 21:33 Uhr
Hans
Library Walker
(Operator)


Hi,

der Heap ist jener Speicherbereich, den das Betriebssystem für Dein Programm zur Verfügung stellt. Wenn Du etwa mittels malloc() in C oder new in C++ Speicherplatz anforderst, dann befindet sich dieser auf dem Heap. Die Fehlermeldung besagt nun, dass Dein Programm versucht hat, auf einen Speicherbereich zuzugreifen, der ihm nicht zugewiesen war. Du hattest also etwa n Bytes auf dem Heap belegt, Dein Programm versuchte aber auf den Speicher an der Stelle n+1 zuzugreifen.
Der Fehler befindet sich irgendwo an einer Stelle, wo das Programm auf angeforderten Speicher zugreift, oder aber auch da, wo angeforderter Speicher frei gegeben werden soll, und die Speicherverwaltung des Betriebssystems dabei feststellt, das die Datenstrukturen inkonsistent sind, mit denen es Deinen Speicher verwaltet.

Guck Dir mal die folgenden Links an, die ich dazu gefunden habe.

http://blog.m-ri.de/index.php/2008/10/27/vs-tipps-tricks-heap-bugs-finden-teil-1/
http://blog.m-ri.de/index.php/2008/10/31/vs-tipps-tricks-heap-bugs-finden-teil-2/
http://blog.m-ri.de/index.php/2008/11/04/vs-tipps-tricks-heap-bugs-finden-teil-3/
http://blog.m-ri.de/index.php/2008/11/27/vs-tipps-tricks-heap-bugs-finden-teil-4/

Die erscheinen mir ganz brauchbar, wobei zum einen allerdings zu sagen ist, dass die Tipps Windowsspezifisch sind und sich aufs Visual Studio beziehen. Zum anderen gehen die Teile 2 bis 4 sehr tief in die Materie, d.h. sie setzen einiges an Hintergrundwissen voraus, das man als Anfänger oder Gelegenheitsentwickler nicht unbedingt hat.

Hans


P.S. Die Abkürzung CRT lese ich im ersten Moment immer als Cathode Ray Tube, auf Deutsch also Kathodenstrahlröhre, was der technische Ausdruck für die Bildröhre eines alten Fernsehers oder Monitors ist. Das kann hier aber nicht gemeint sein. Die Frage ist also, was dann? - Die Antwort lautet: C/C++ RunTime library.
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 10.02.2015 um 21:36 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.02.2015, 21:43 Uhr
Hans
Library Walker
(Operator)


Nachtrag:
Da Du schreibst, dass die Fehlermeldung auch erst kommt, nachdem Du schon viele Iterationen durch denselben Programmcode durchlaufen hast, wirst Du ohne Debugger nicht weiter kommen, um den Fehler zu finden. Du wirst also weitere Variablen überwachen müssen, die mit dem Zugriff auf dem angeforderten Speicher zu tun haben. Also neben Zeigern auch Array-indizes und Schleifenzähler. Dabei ist zu überprüfen, ob deren Werte in gültigen Bereichen bleiben.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.02.2015, 22:36 Uhr
~Underfaker
Gast


Hallo,

danke schonmal bis hierhin.
Ich sehe mir das noch detaillierter an, allerdings hab eich bereits versucht "ASSERT(AfxCheckMemory());" zu verwenden.
VS sagt mir jedoch:
error C3861: "ASSERT": Bezeichner wurde nicht gefunden.
error C3861: "AfxCheckMemory": Bezeichner wurde nicht gefunden.

Benötige ich noch zusätzlich etwas um das nutzen zu können?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.02.2015, 22:56 Uhr
~Underfaker
Gast


Ebenfalls Nachtrag:

Hab's raus, geht ohne MFC wohl nur mit :_ASSERTE( _CrtCheckMemory( ) );
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.02.2015, 21:20 Uhr
~Underfaker
Gast


Hat mir sehr geholfen.
Habe den Fehler finden können, vielen Dank.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.02.2015, 21:45 Uhr
Hans
Library Walker
(Operator)


Bitte sehr.

Zu #003 noch:

Zitat:
hab eich bereits versucht "ASSERT(AfxCheckMemory());" zu verwenden.
VS sagt mir jedoch:
error C3861: "ASSERT": Bezeichner wurde nicht gefunden.
error C3861: "AfxCheckMemory": Bezeichner wurde nicht gefunden.

Benötige ich noch zusätzlich etwas um das nutzen zu können?


Ja. In C muss man noch

C++:
#include <assert.h>


bzw. in C++

C++:
#include <cassert>


in den Quelltext schreiben, um es nutzen zu können.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 11.02.2015 um 21:46 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: