logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

terencjoo 05 Lis 2009 11:21 2759 7
REKLAMA
  • #1 7218178
    terencjoo
    Poziom 12  
    Posty: 85
    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?
  • REKLAMA
  • #2 7218571
    lukagrom
    Poziom 16  
    Posty: 195
    Pomógł: 29
    Ocena: 12
    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.
  • REKLAMA
  • #3 7218626
    several
    Poziom 15  
    Posty: 140
    Pomógł: 14
    Ocena: 1
    A po co dynamicznie alokować pamięć skoro rozmiar tablicy jest stały?
  • REKLAMA
  • #4 7218665
    skynet_2
    Poziom 26  
    Posty: 1008
    Pomógł: 74
    Ocena: 9
    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.
  • REKLAMA
  • #6 7219988
    terencjoo
    Poziom 12  
    Posty: 85
    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.
  • #7 7220106
    jestam
    Specjalista Automatyk
    Posty: 1794
    Pomógł: 210
    Ocena: 144
    Cytat:
    Za pomocą debuggera nie da rady...

    http://msdn.microsoft.com/en-us/library/za56x861.aspx

    Cytat:
    Sprawdziłem, szajs nie program, nie ma na windowsa, tylko na linuksa


    Znaczy sprawdziłeś że "szajs" czy uważasz że "szajs" bo "tylko na linuksa"? Regulamin.
  • #8 7221140
    Dr.Vee
    VIP Zasłużony dla elektroda
    Posty: 1784
    Pomógł: 307
    Ocena: 76
    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

Podsumowanie tematu

✨ Problem dotyczy błędu zapisu poza przydzieloną pamięcią dynamiczną w C++, objawiającego się komunikatem HEAP CORRUPTION DETECTED podczas zwalniania pamięci za pomocą delete[]. Przyczyną jest prawdopodobnie zapis do elementu tablicy poza jej zakresem, np. x[5], mimo że autor twierdzi, iż nie ma takich przypisań. Wskazano, że w kompilatorze gcc/g++ takie przekroczenie granicy może nie generować błędów, a w Visual Studio debugger nie pokazuje zawartości pamięci wskazywanej przez wskaźnik, co utrudnia lokalizację błędu. Sugerowano użycie narzędzia Valgrind do wykrywania błędów pamięci, jednak jest ono dostępne tylko na systemy Linux, co stanowi problem dla użytkowników Windows. Alternatywnie, proponowano ustawienie breakpointa na adresie &x[5] w debuggerze, aby wykryć moment zapisu poza przydzieloną pamięcią. Poruszono też kwestię sensowności dynamicznej alokacji pamięci przy stałym rozmiarze tablicy.
Wygenerowane przez model językowy.
REKLAMA