Strona główna C++ C++ Hardware HTML i javascript Java Software SQL

C++|error - heap corruption detected after normal block...

Dodano: 2011-02-18

Tworząc programy w języku C++ można się spotkać z błędem przekroczenia ilości miejsca przydzielonego na tablicę elementów, błąd ten może być przechwycony przez środowisko, w którym pracuje programista, lecz nie zawsze tak się dzieje. Poniżej przykład komunikatu błędu:

This may be due to a corruption of the heap, which indicates a bug in *.exe or any of the DLLs it has loaded.

Nie zawsze jest łatwo wyizolować złą implementacje działania na tablicach (zbyt małe doświadczenie), jeżeli są one zawarte w blokach, do których dostęp jest możliwy po spełnieniu np.: jakiś warunków.

Na początku przygody z C++, najłatwiej popełnić błąd używając funkcji operujących na ciągach znakowych np.: umożliwiających dodawanie jednego ciągu do drugiego (strcat()) lub kopiowanie tablic znakowych (strcpy()).

Dlatego warto dobrze przetestować tworzony program i ostrożnie wykonywać działania na tablicach n-elementowych.

Niekiedy błąd przekroczenia ilości miejsca ujawnia się niedeterministycznie, może to być spowodowane nieprzewidywalną ilością elementów, które będą wczytywane do tablicy lub też użyciem w niektórych wypadkach delete[], po przekroczeniu miejsca przydzielonego dla tablicy. Przykład poniżej:

char* arrChar = new char[12];
arrChar[0] = '\0';

// dla uproszczenia wpisuję ciąg aby można było zobaczyć jego długość
// jak widać jest dużo większa niż długość tablicy arrChar
char* arrTemp = "adsfdsfasdffghfghfghgfhgf";

// przeważnie zadziała poprawnie, teraz maszyny mają sporo wolnej pamięci ;)
strcpy(arrChar, arrTemp);

if (something01 == something02){
	// tutaj pojawi się problem
	delete[] arrChar;
}

...

Najciekawszy przypadek zostawiłem na koniec. W bardziej „złożonych” projektach może się okazać, że działanie na tablicach będzie na tyle skomplikowane, że środowisko pracy nie będzie wstanie wykryć problemu, dopiero w systemie użytkownika pojawią się komunikaty o nieprawidłowym zachowaniu programu. Może on się objawić następującą informacją:

heap corruption detected after normal block...

Odtworzenie sytuacji w środowisku programistycznym nadal nie ujawnia problemu, nawet w przypadku próby powielenia czynności jak i danych wprowadzanych przez użytkownika. Warto wtedy wrócić do starej dobrej metody i zanegować linie i kompilować program za każdym razem by móc sprawdzić go w środowisku użytkownika. W niektórych przypadkach tylko tak można wyizolować przyczynę błędu (czytaj szybciej dostrzec nieprawidłową implementację działań na tablicach;) - życzę miłego szukania.