Moje pytanie dotyczy usunięcia tablicy z pamięci sterty. Przeczytałem książkę i inne zasoby i inne zasoby like this one, i wszystkie z nich powiedziały, że do usunięcia tablicy z sterty musimy użyć funkcji []
po delete
, więc jeśli piszemy nasze kody bez użycia []
, to mamy wyciekłą pamięć.usuwanie tablicy ze sterty
na przykład, należy rozważyć poniżej programu
int *s = new int[10];
delete [] s;
Przetestowałem ten mały program w Linuksie za pomocą pakietu valgrind
(ten pakiet mógł sprawdzić ile pamięci produkuje wyciekły przez złego kodowania) .Poprzez poniżej komendy w systemie Linux widzieliśmy, że wszystko jest w porządku
sudo valgrind --leak-check=full ./<path_to_exe_file>
Oto wynik polecenia Linux
==4565== HEAP SUMMARY:
==4565== in use at exit: 0 bytes in 0 blocks
==4565== total heap usage: 1 allocs, 1 frees, 40 bytes allocated
==4565==
==4565== All heap blocks were freed -- no leaks are possible
Ale moje pytanie pojawiło się, gdy próbuję użyć delete
bez korzystania z []
i kiedy sprawdzam wyjście valgrind
widziałem, że cała pamięć sterty została zwolniona, więc czy to jest poprawne? lub valgrind
nie wiedziałem, że cała stertka nie została uwolniona i jakaś część tablicy wciąż jest w środku !! ?? a jeśli valgrind
nie może wykryć tego rodzaju wyciekanej pamięci, to istnieje pakiet, który może to wykryć.
'int * s = nowy int [10]; delete s; 'podaje niezdefiniowane zachowanie. Forma operatora 'delete' musi pasować do formy operatora' nowy'. Jedna z możliwych manifestacji niezdefiniowanego zachowania działa zgodnie z oczekiwaniami, takimi jak widzisz. Z innym kompilatorem może działać inaczej lub wcale. – Peter
"usuń" to, co "nowe" i "usuń []", co "nowe" [-ed]. Albo lepiej użyj zamiast tego inteligentnych wskaźników. – Ron
Zastąp 'int' przez' std :: vector 'lub' std :: string', aby zobaczyć oczekiwany wyciek w twoim programie UB. –
Jarod42