Potrzebuję odświeżacza C++. Dlaczego daje to wyjątek pamięci?char * new i usuń błąd [] przy przypisaniu łańcucha znaków
pear = new char[1024];
pear = "happy go lucky";
delete [] pear; // exception
Potrzebuję odświeżacza C++. Dlaczego daje to wyjątek pamięci?char * new i usuń błąd [] przy przypisaniu łańcucha znaków
pear = new char[1024];
pear = "happy go lucky";
delete [] pear; // exception
pear = new char[1024];
Pamięć do 1024 znaków jest przydzielana ze sterty i pear
punktów na początku.
pear = "happy go lucky";
pear
wskazuje teraz na ciąg dosłownym który rezyduje w segmencie tylko do odczytu, a wcześniej przydzielona pamięć jest wyciekły.
delete [] pear;
Próbujesz zwolnić ciąg tylko do odczytu, który jest niezdefiniowanym zachowaniem przejawiającym się jako wyjątek środowiska wykonawczego.
AH! Zgadza się ... dziękuję. – Jake
gruszka = "Happy go lucky";
Ten zastępuje wskaźnik przydzielonego przez new char[]
. Teraz Twój delete[] pear
próbuje uwolnić statycznie przydzielony ciąg.
To jest złe. Możesz tylko delete
, co przydzielisz z new
. A ponieważ nadpisałeś (i zgubiłeś) ten wskaźnik, nie możesz tego zrobić.
+1 ponieważ byłeś pierwszy – Jake
To, co robisz, to przypisanie pear
do przydzielonej tablicy znaków na stercie, a następnie ponowne przypisanie jej w celu wskazania łańcucha znajdującego się w statycznej lokalizacji. Jeśli spróbujesz usunąć, będzie to błąd, ponieważ nie powinieneś usuwać rzeczy w tej statycznej lokalizacji.
to pierwsza linia równa "char * pear = new char [1024];'? –