Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Sposób wykrycia błędu zapisu poza pamięcią wskaźnika [c++]

terencjoo 05 Lis 2009 11:21 2282 7
  • #1 05 Lis 2009 11:21
    terencjoo
    Poziom 12  

    Alokuje dynamicznie pamięć
    unsigned int *x=new unsigned int[5];
    i na końcu programu przy zwalnianiu pamięci delete []x wyskakuje mi komunikat błędu:
    HEAP CORRUPTION DETECTED: after Normal block (#274) at 0x003E7CA8 .CRT detected that the application wrote to memory after end of heap buffer. (Retry to debug application)
    Niby można nacisnąć ignoruj i program kontynuuje swoją pracę, ale mimo wszystko chcialbym pozbyć się wyskakiwania tego okienka. Błąd oznacza, że pewnie w programie wykonano zapis poza przydzieloną pamięcią czyli np. w komórce pamięci x[5], np.
    x[5]=8;
    Niestety przejrzałem program milion razy i naprawdę nie ma przypisania poza pamięcią. Więc jak wykryć w którym miejscu może być błąd?

    0 7
  • #2 05 Lis 2009 13:25
    lukagrom
    Poziom 16  

    No i właśnie chyba o to chodzi, czyli zapis poza przydzieloną pamięcią. Dla odmiany w kompilatorze gcc/g++, przechodzi bez komunikatów. Takie "przekroczenie granicy" można podpiąć pod obsługe wyjątków.

    0
  • #3 05 Lis 2009 13:41
    several
    Poziom 15  

    A po co dynamicznie alokować pamięć skoro rozmiar tablicy jest stały?

    0
  • #4 05 Lis 2009 13:53
    skynet_2
    Poziom 26  

    terencjoo napisał:
    Więc jak wykryć w którym miejscu może być błąd?

    Tak jak zazwyczaj się znajduje 90% błędów czyli za pomocą debuggera.

    0
  • #6 05 Lis 2009 18:58
    terencjoo
    Poziom 12  

    Za pomocą debuggera nie da rady, bo danych w bloku pamięci wskazywanych przez wskaźnik Visual niestety nie pokazuje:/, np. jak mam jakiś wskaźnik * int x to w trybie debugowania jak się najedzie myszką na x to tylko adres się pokazuje tego wskaźnika. Rozmiar tablicy nie jest stały, dałem tylko dla przykładu tutaj 5. Sprawdzę tego valgrinda.
    Sprawdziłem, szajs nie program, nie ma na windowsa, tylko na linuksa.

    0
  • #8 05 Lis 2009 22:11
    Dr.Vee
    VIP Zasłużony dla elektroda

    Ustaw sobie breakpointa na zapis np. pod adres &x[5].

    Technicznie rzecz biorąc nie napisałeś, że uruchamiasz swój program pod windowsem - gdybyś to zrobił, to nikt by Ci nie polecał "szajskich" narzędzi pod linuxa ;)

    Pozdrawiam,
    Dr.Vee

    0