2012-04-26 21 views

Odpowiedz

9
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.

+0

AH! Zgadza się ... dziękuję. – Jake

5

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ć.

+0

+1 ponieważ byłeś pierwszy – Jake

2

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.