2013-02-15 15 views
7

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?

+4

Zasada: dokładnie jedno "usuń" dla każdego "nowego"; dokładnie jedno 'delete []' dla każdego 'new []'. –

+0

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

Odpowiedz

12

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.

+0

Czy możesz jednak? – dtc

+0

@ dtc nope, nie można usuwać obiektów, które nie są nowe. – billz

+0

ok, dzięki za szybką odpowiedź. był po prostu ciekawy: P. – dtc

1

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.

0

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.

+0

Dlaczego konsekwentnie używasz czegoś ze standardowej biblioteki, nawet nie znając aplikacji? –

0

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++).

+0

Tak, prawdopodobnie jest, ponieważ "delete" nie powinno mieć żadnego znaczenia, gdy zastosowane do zmiennych na stosie. Czy możesz zaproponować lepsze sformułowanie? –

+0

(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.) –

+0

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

Powiązane problemy