2015-02-07 6 views
5

Czy bezpieczne i/lub dobre praktyki są następujące:Ponowne użycie wskaźnika po `usuń`

//NewList is a member function of a class 
void NewList(int size){ 

delete[] list; //list is a member variable; an already initialized dynamic array. 

list=new ListObject[size]; 

} 

Ja w zasadzie odrzucając poprzednią tablicę bo będę używać do przechowywania różnych danych w klasie, a zatem wymagają nowego list do przechowywania innych informacji na temat nowych danych. Jeśli to nie jest dobra praktyka, jaka jest alternatywa?

+2

** Użyj 'wektora' **. –

+0

Czy przeczytałeś [Zasady trzech] (https://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)? Legalne jest przypisywanie wskaźnika do nowej pamięci, bez względu na to, czy jest ** bezpieczne **, czy też zależy od reszty kodu. –

+0

"Czy to bezpieczne i/lub dobre praktyki, aby zrobić coś, co następuje?" Tak, jest bezpiecznie. To, czy jest dobre, zależy od opinii. –

Odpowiedz

3

To zależy. Za każdym razem, gdy tworzysz obiekt z nowym, musisz go usunąć po użyciu. W podanej funkcji kasujesz tworzenie nowego, ale czy usuwasz także po zakończeniu pracy z obiektem? Bezpieczniej jest stworzyć obiekt i usunąć go, gdy obiekt znajdzie się poza zakresem.

Unikałbym, jeśli to możliwe, ponieważ można utworzyć wyciek pamięci, jeśli nie zostanie odpowiednio usunięty.

2

Tak, ponowne użycie wskaźnika do zapisania nowego adresu pamięci po usunięciu poprzednio wskazanej pamięci jest całkiem w porządku.

Należy uważać, aby nie usunąć starego adresu pamięci, który wciąż jest zapisany w wskaźniku. W Twoim fragmencie kodu nie jest to jednak problem.

Na marginesie, przez większość czasu powinieneś używać std::vector, jeśli chcesz dynamicznie alokować tablicę, jak wspomniano w komentarzach.

1

Nic nie jest nie w porządku z tym, co robisz. Jeśli jednak jest to funkcja członkowska klasy, a list jest zmienną składową, pamiętaj, że kod, który masz, jest , a nie wyjątek bezpieczny.

Innymi słowy, jeśli z jakiegoś powodu połączenie z new[] zakończy się niepowodzeniem, tablica list została zniszczona i nie można odzyskać danych.

Lepiej to zrobić:

void NewList(int size) 
{ 
    ListObject* temp = new ListObject[size]; 
    delete[] list; 
    list = temp; 
} 

Jeśli wywołanie new[] zgłasza wyjątek, nie zostały zniszczone oryginalne dane.

Jednak wszystko to zostało załatwione, jeśli użyłeś std::vector, jak sugerowali inni.