Mam pytanie. Czy w c++ możliwe jest by destruktor klasy niszczył obiekt tej klasy np jeżeli jest spełniony jakiś warunek?
Tak się zastanawiam jak są zaimplementowane te inteligentne wskaźniki.
- Rejestracja:około 12 lat
- Ostatnio:około 7 lat
- Lokalizacja:Tutaj,obok
- Postów:759

- Rejestracja:około 12 lat
- Ostatnio:12 dni
- Lokalizacja:Wrocław
- Postów:399
Kompilator MSVC robi to właśnie w ten sposób. W destruktorze jest argument bool, który określa czy obiekt ma zostać usunięty z pamięci.
Co do inteligentnych wskaźników: implementację możesz podpatrzeć w implementacjach M$ chociażby (cała klasa jest w pliku nagłówkowym ponieważ jest szablon).
- Rejestracja:około 12 lat
- Ostatnio:około 7 lat
- Lokalizacja:Tutaj,obok
- Postów:759
A czy jeżeli będę miał destruktor w klasie obj zaimplementowany tak:
destruktor()
{///Zakladajac ze a = 665
if(a == 667)destory_object();
)
i użyje
obj object;
delete object ///<- Tu wywoływany jest destruktor.
To czy to spowoduje zniszczenie obiektu?

- Rejestracja:prawie 11 lat
- Ostatnio:prawie 2 lata
- Postów:2500
Ale nie jesteś w stanie napisać funkcji destroy_object()
tak, żeby usuwała obiekt w którym jesteś. Nie masz władzy nad tym.
Generalnie celem destruktora nie jest usuwanie obiektu, co często mylnie sądzą początkujący (ja sam tak myślałem). Celem destruktora jest usuwanie zasobów (obiektów, dynamicznej zarezerwowanej pamięci), które posiada ten obiekt.

- Rejestracja:prawie 11 lat
- Ostatnio:prawie 2 lata
- Postów:2500
Masz tu przykładową implementację shared_ptr
, tylko nie wiem czy ta lektura będzie przyjemna: http://svn.boost.org/svn/boost/trunk/boost/smart_ptr/shared_ptr.hpp
Na poziomie koncepcyjnym i mocno upraszczając do przypadku wskaźnika na int
, mamy coś takiego:
class shared_ptr
{
public:
shared_ptr(int* source) : ptr(source) { ++count; }
shared_ptr(const shared_ptr& rhs) : ptr(rhs.ptr) { ++count; } // podobnie z operatorem przypisania
~shared_ptr()
{
--count;
if (count == 0)
delete ptr;
}
private:
int* ptr;
static int count = 0;
};
W destruktorze usuwasz pamięć wskazywaną przez goły wskaźnik ptr
, natomiast nie usuwasz samego obiektu klasy shared_ptr
.

- Rejestracja:ponad 21 lat
- Ostatnio:około 16 godzin
twonek napisał(a):
Ale nie jesteś w stanie napisać funkcji
destroy_object()
tak, żeby usuwała obiekt w którym jesteś. Nie masz władzy nad tym.
To dlaczego ja widziałem delete this
i to w kodzie Microsoftu? ;-)
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.