piszę niektóre kodu tak:Czy muszę usunąć statyczną tablicę w C++?
while(true) {
int array[5];
// do something
}
Na każdym obrocie pętli, tablica jest nowa tablica. Czy muszę usunąć tablicę na końcu pętli?
piszę niektóre kodu tak:Czy muszę usunąć statyczną tablicę w C++?
while(true) {
int array[5];
// do something
}
Na każdym obrocie pętli, tablica jest nowa tablica. Czy muszę usunąć tablicę na końcu pętli?
Czy muszę usunąć tablicę na końcu pętli?
nr, nie trzeba go usunąć, ponieważ array
posiada automatyczną czas przechowywania. Zostanie on zwolniony po wyjściu z każdej pętli while.
Musisz zadzwonić pod numer delete []/new []
i delete/new
w parach.
nr
Zmienne zadeklarowane na stosie nie muszą być ręcznie zwalniane. Twoja tablica ma zasięg w pętli while
. Dla każdej iteracji pętli tablica jest przydzielana na stosie, a następnie automatycznie przydzielana.
Tylko tablica zadeklarowana z new[]
musi być ręcznie zwalniane z delete[]
Również tablica zadeklarować nie jest static
w jakimkolwiek sensie. Słowo kluczowe static
ma określone znaczenie w C. Deklarowana tablica jest faktycznie przechowywana jako zmienna auto
(automatyczna pamięć masowa), co oznacza, że jest automatycznie deallocowana, gdy wykracza poza zakres.
Nie można (chyba że używa się złożonego zestawu) i nie trzeba usuwać tablic ani obiektów przydzielonych na stosie.
Jeśli z jakiegoś powodu czujesz potrzebę, aby usunąć tablicę utworzoną ,:
int *array = new int[5];
//do something
delete[] array;
Także moja rada jest użycie std::vector
zamiast tablic.
Dlaczego konsekwentnie używasz czegoś ze standardowej biblioteki, nawet nie znając aplikacji? –
Inne odpowiedzi poprawnie wyjaśniły, że delete
jest niepotrzebny, ponieważ twoja macierz jest na stosie, ale nie wyjaśniła, co to jest stos. Jest tutaj bardzo dobre wytłumaczenie: What and where are the stack and heap?
Jeśli chodzi o twoje pytanie: w C i C++, chyba że wyraźnie powiesz kompilatorowi inaczej, twoje zmienne zostaną umieszczone w stosie, co oznacza, że istnieją tylko w zasięgu (że jest, blok), w którym są zadeklarowane. Sposób jawnego poinformowania kompilatora, aby umieścić coś na stercie, jest albo z malloc
(droga C) lub new
(droga C++). Tylko wtedy musisz zadzwonić pod numer free
(w C) lub delete
/delete[]
(C++).
Tak, prawdopodobnie jest, ponieważ "delete" nie powinno mieć żadnego znaczenia, gdy zastosowane do zmiennych na stosie. Czy możesz zaproponować lepsze sformułowanie? –
(Powód, dla którego sformułowałem to w ten sposób, był oryginalny, ponieważ oryginalne pytanie brzmiało "czy potrzebuję **, aby usunąć tablicę", tj. Czy jest to konieczne, a odpowiedź brzmi: nie, to nie jest konieczne.) –
Tak, miałem na myśli stertę. Dzięki. Chociaż byłby bardziej przydatny jako komentarz niż jako komentarz do starego komentarza, ponieważ nie dostałem powiadomienia o edycji. –
Zasada: dokładnie jedno "usuń" dla każdego "nowego"; dokładnie jedno 'delete []' dla każdego 'new []'. –
to pytanie było zadawane tak wiele razy prawie w tej samej formie. zasada pinky ... najpierw szukaj dupków, zwłaszcza jeśli jest to proste pytanie. – thang