[cpp][operator delete [] ] wskaźnik na kilka elementów
Ostatnio zmodyfikowano 2017-04-27 20:09
aaadam Temat założony przez niniejszego użytkownika |
[cpp][operator delete [] ] wskaźnik na kilka elementów » 2017-04-27 12:39:19 witam, mam kilka obiektów np. : MojTyp *tablica[4]; gdy chcę zwolinić pamięć to wystarczy to : for( unsigned int i = 0; i <= 3; i++ ) { delete tablica[ i ]; }
czy muszę w ten sposób aby zwolnić całą pamięć for( unsigned int i = 0; i <= 3; i++ ) { delete tablica[ i ]; } delete[] tablica;
w tym drugim sposobie wywala mi błąd w tym miejscu : delete [] tablica; |
|
Rashmistrz |
» 2017-04-27 12:47:59 MojTyp * tablica[ 4 ]; Panie... ależ to jest 4ro elementowa tablica wskaźników na obiekty typu MojTyp. Jaki? |
|
aaadam Temat założony przez niniejszego użytkownika |
» 2017-04-27 13:40:53 jakoś tak to by było że tablica a jak ze zwalnianiem pamieci jak ?? a błąd to Taki : debug_heap.cpp line 892 Expression : is_block_type_valid(header->_block_use) for more info .... |
|
aaadam Temat założony przez niniejszego użytkownika |
» 2017-04-27 14:51:53 dobra chyba już rozumiem :)
ten MojTyp*tablica[4];
to nie jest element dynamiczny i sam sie skasuje gdy wyjdę z zakresu bloku ?? |
|
Rashmistrz |
» 2017-04-27 16:50:21 Poczytaj trochę: Dynamiczne zarządzanie pamięcią new i delete» Kurs C++ ♦Dynamic memory - C++ Tutorialslekcjato nie jest element dynamiczny i sam sie skasuje gdy wyjdę z zakresu bloku ?? |
Wtedy to się dzieje wyciek pamięci. Jeśli przypisałeś tamte wskaźniki na zaalokowaną pamięć to po wyjściu z bloku tracisz te wskaźniki na zaalokowaną pamięć, czyli program traci dostęp do tych danych, ale wciąż je posiada. System odzyska tą pamięć po całkowitym zamknięciu programu. delete używa się na wskaźniku, który został odtrzymany przez new. Zaś delete[] na wskaźniku, który został odtrzymany przez new[]. Nie mam pojęcia jak alokowałeś pamięć do wskaźników, więc nie wiem jak powinieneś je zwalniać... Zwróć uwagę na to: delete[] tablica; tablica jest zadeklarowana tak: MojTyp * tablica[ 4 ]; Więc powinieneś "deletować" elementy tej tablicy w ten ... lub ten sposób: ... delete tablica[ i ]; delete[] tablica[ i ]; W zależności od tego jak były alokowane te typy. ______________________________________________________________ EDIT1: Nie mam zupełnego pojęcia dealokowaniu pojedynczych obiektów przez delete, które zostały zaalokowane za pomocą new[]. Nie znalazłem do tego żadnych informacji. EDIT2: Poszukałem z 20 minut i znalazłem to na Stack Overflow: In the first alternative (delete object), the value of the operand of delete shall be a pointer to a non-array object or a pointer to a sub-object (1.8) representing a base class of such an object (clause 10). If not, the behavior is undefined.
In the second alternative (delete array), the value of the operand of delete shall be the pointer value which resulted from a previous array new-expression. If not, the behavior is undefined. |
|
|
aaadam Temat założony przez niniejszego użytkownika |
» 2017-04-27 20:09:53 Dziękuję bardzo za pomoc :) Miałem wyciek pamięci właśnie i teraz to prawie. |
|
« 1 » |