• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Ostateczne usunięcie wskaźnika w C++

Object Storage Arubacloud
0 głosów
1,935 wizyt
pytanie zadane 5 września 2019 w C i C++ przez Vitall Początkujący (400 p.)

Cześć,

jestem na kolejnym etapie poznawania C++ i zgłębiania wiedzy programistycznej.

Tym razem chodzi o.. wskaźniki.
O ile rozumiem jak działa operator new - alokuje pamieć, tzw. obiekt danych, zwraca jego adres, który można przypisać do wskaźnika, o tyle działanie operatora delete  w sumie też jest jest jasne - zwalnia pamięć, na którą wskazuje wskaźnik, czyli to co kryje się pod adresem przechowywanym przez wskaźnik, czyli to, co mamy po zastosowaniu operatora deferencji, ale delete  nie usuwa wskaźnika.

Pytanie więc: jak usunąć trwale, raz na zawsze, wskaźnik - czy da się to zrobić i jeśli tak, to jak tego dokonać?

Z góry dzięki za odpowiedź :)

Pozdrawiam,

Vitall.

 

3 odpowiedzi

+2 głosów
odpowiedź 5 września 2019 przez adrian17 Ekspert (344,860 p.)
edycja 5 września 2019 przez adrian17

Pytanie więc: jak usunąć trwale, raz na zawsze, wskaźnik - czy da się to zrobić i jeśli tak, to jak tego dokonać? 

Odwrócę pytanie:

void func() {
    int x = 5;
}

Czy da się jakoś "usunąć na trwale, na zawsze" zmienną x? Ręcznie, nie za bardzo. A czy jest sens? Też nie za bardzo - x istnieje tylko w ciele funkcji, więc jak wyjdziesz z func() to tak jakby go nigdy nie było.

Ze wskaźnikiem jest analogicznie:

void func() {
    int *a = nullptr;
    int *b = new int; // (delete b;)
}

a, b tutaj w zasadzie niczym się nie różnią od x, obie to jakieś proste wartości: x liczbowa, a a/b wskazujące na pamięć (w zasadzie też liczbowe pod maską).

Żadnej tutaj nie ma sensu i potrzeby "usuwać".

(EDIT: natomiast tylko dodam że czasem przydaje się ustawienie wskaźnika na nullptr po delete, żeby zmniejszyć ryzyko ponownego odwołania do zwolnionej pamięci)

+1 głos
odpowiedź 5 września 2019 przez Ehlert Ekspert (212,670 p.)
Generalnie możesz zadeklarować wskaźnik na wskaźnik, utworzyć to co chcesz, a potem przy usuwaniu usunąć też wskaźnik. Ale czy to ma sens? Jeśli deklarujesz wskaźnik jako normalną zmienną statyczną w pewnym zakresie, to wskaźnik ten będzie usunięty po tym jak zakończy się wykonanie instrukcji związanej z tym zakresem.
komentarz 5 września 2019 przez Vitall Początkujący (400 p.)
@Ehlert, ale jeśli stworzę wskaźnik na wskaźnik i usunę jeden z nich, to drugi i tak pozostaje "żywy"? <- to do pierwszej części odpowiedzi ;) do drugiej w swojej edukacji jeszcze nie doszedłem, żeby móc się odnieść, ale zrobię to jak wejdę poziom wyżej ze swoją wiedzą :)
dzięki!
0 głosów
odpowiedź 5 września 2019 przez tangarr Mędrzec (154,780 p.)

Po zwolnieniu pamięci wskaźnik ciągle wskazuje na to samo miejsce w pamięci w którym były dane.

Taki nieprawidłowy wskaźnik nazywany jest wiszącym wskaźnikiem (dangling pointer). Najlepszym rozwiązaniem jest wyzerowanie wskaźnika po zwolnieniu obiektu (żeby nie użyć go przez przypadek)

delete wskaznik;
wskaznik = nullptr;

Ewentualnie możesz napisać funkcję (szablon) zwalniający pamięć

template<class T>
void my_delete(T *&ptr) {
    delete ptr;
    ptr = nullptr;
}
1
komentarz 5 września 2019 przez tkz Nałogowiec (42,000 p.)
Po co skoro są inteligentne wskaźniki?
komentarz 5 września 2019 przez manjaro Nałogowiec (37,390 p.)
No dokładnie miałem o tym pisać ale już tkz mnie wyprzedził ;)

Poczytaj sobie o std::shared_ptr i std::unique_ptr

Podobne pytania

0 głosów
3 odpowiedzi 597 wizyt
0 głosów
1 odpowiedź 145 wizyt
pytanie zadane 30 marca 2020 w C i C++ przez Quegon23 Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 281 wizyt

92,550 zapytań

141,394 odpowiedzi

319,522 komentarzy

61,935 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...