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

Zarządzanie pamięcią

Ostatnio zmodyfikowano 2017-10-26 20:29
Autor Wiadomość
Anim
Temat założony przez niniejszego użytkownika
Zarządzanie pamięcią
» 2017-10-26 14:57:43
W nawiązaniu do tematu wcześniejszego, który został zamknięty :)

http://cpp0x.pl/forum/temat/​?id=26092.

Mam dwa pytania. A szczerze mówiąc to pytanie i prośbę...

Pytanie... Jeśli, tak jak w tamtym temacie obiekty zostały powołane w następujący sposób:

C/C++
Pochodna * a = new Pochodna( int );
Pochodna * b = new Pochodna( int );
Pochodna * c = new Pochodna( int );

Abstrakcyjny * A[] = { a, b, c };

To jak to zwolnić przy użyciu delete? Zrobiłem tak:

C/C++
delete a;
delete b;
delete c;

natomiast jak zwolnić na końcu sam obiekt *A[] ?


Natomiast prośba jest następująca. Za sugestią @michal11 zacząłem czytać o shared_ptr oraz unique_ptr, ale nie do końca rozumiem zastosowanie tejże metody wskaźnikowej. I w związku z tym chciałbym spytać, czy ktoś mógłby mi powyższy przykład rozpisać na inteligentnych wskaźnikach? Byłbym wdzięczny.

//EDIT
Zrobiłem tak:

C/C++
std::shared_ptr < Pochodna > a( new Pochodna( int ) );
std::shared_ptr < Pochodna > b( new Pochodna( int ) );
std::shared_ptr < Pochodna > c( new Pochodna( int ) );

std::shared_ptr < Abstrakcyjny > A[] = { a, b, c };


I działa... To wszystko? To jest ta magia, co nie wymaga pamiętania o zwalnianiu pamięci ^^

Ps: Nadal nie wiem jak zwalniać powyższe poprzez użycie delete :)
P-166102
Monika90
» 2017-10-26 15:54:25

natomiast jak zwolnić na końcu sam obiekt *A[] ?
Obiektu A nie musisz zwalniać, bo nie został utworzony za pomocą new.

A to drugie to lepiej tak
C/C++
std::unique_ptr < Abstrakcyjny > A[] =
{
    std::make_unique < Pochodna >( 11 ), std::make_unique < Pochodna >( 12 ), std::make_unique < Pochodna >( 13 )
};
lub
C/C++
auto a = std::make_unique < Pochodna >( 11 );
auto b = std::make_unique < Pochodna >( 12 );
auto c = std::make_unique < Pochodna >( 13 );

std::unique_ptr < Abstrakcyjny > A[] = { std::move( a ), std::move( b ), std::move( c ) };
nie używaj shared_ptr bez powodu.

A twoja klasa Abstrakcyjny musi mieć wirtualny destruktor.
P-166103
Anim
Temat założony przez niniejszego użytkownika
» 2017-10-26 20:29:04
Dziękuję Moniko :)
P-166104
« 1 »
  Strona 1 z 1