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

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
1,295 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 (323,640 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 (209,990 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 VIP (140,920 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 (41,900 p.)
Po co skoro są inteligentne wskaźniki?
komentarz 5 września 2019 przez manjaro Nałogowiec (36,750 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 439 wizyt
0 głosów
1 odpowiedź 102 wizyt
pytanie zadane 30 marca 2020 w C i C++ przez Quegon23 Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 145 wizyt

89,727 zapytań

138,332 odpowiedzi

309,340 komentarzy

59,649 pasjonatów

Advent of Code 2022

Top 15 użytkowników

  1. 429p. - Argeento
  2. 427p. - nidomika
  3. 396p. - Mikbac
  4. 392p. - ssynowiec
  5. 390p. - Łukasz Eckert
  6. 387p. - TheLukaszNs
  7. 386p. - rucin93
  8. 382p. - Marcin Harasimowicz
  9. 382p. - Michal Drewniak
  10. 378p. - JMazurkiewicz
  11. 373p. - tokox
  12. 367p. - Jarosław Roszyk
  13. 362p. - adrian17
  14. 359p. - overcq
  15. 350p. - Mawrok
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...