Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[cpp][operator delete [] ] wskaźnik na kilka elementów

Ostatnio zmodyfikowano 2017-04-27 20:09
Autor Wiadomość
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 :

C/C++
for( unsigned int i = 0; i <= 3; i++ )
{
    delete tablica[ i ];
}

czy muszę w ten sposób aby zwolnić całą pamięć
C/C++
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;
P-160545
Rashmistrz
» 2017-04-27 12:47:59
MojTyp * tablica[ 4 ];

Panie...
ależ to jest 4ro elementowa tablica
wskaźników na obiekty typuMojTyp.

wywala mi błąd
Jaki?
P-160546
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 ....
P-160550
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 ??
P-160554
Rashmistrz
» 2017-04-27 16:50:21
Poczytaj trochę:
» Kurs C++Dynamiczne zarządzanie pamięcią new i delete lekcja
» Kurs C++ ♦Dynamic memory - C++ Tutorialslekcja

to 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 ]; /* 'i' jest od 0ra do 3ech */

delete[] tablica[ i ]; /* 'i' jest od 0ra do 3ech */

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.
P-160558
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.
P-160561
« 1 »
  Strona 1 z 1