• 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++

VPS Starter Arubacloud
0 głosów
1,901 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,100 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,630 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 575 wizyt
0 głosów
1 odpowiedź 142 wizyt
pytanie zadane 30 marca 2020 w C i C++ przez Quegon23 Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 272 wizyt

92,452 zapytań

141,262 odpowiedzi

319,077 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...