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

Wskaźnik usuniętego obiektu

0 głosów
539 wizyt
pytanie zadane 23 lutego 2017 w C i C++ przez Nekronomik Użytkownik (600 p.)
Witam, problem wygląda tak że mam adres jakiegoś obiektu i 2 wskaźniki na ten obiekt.
Do tych dwóch adresów przypisałem adres obiektu (oczywiście wskaźniki dynamiczne).
Na jednym wskaźniku usunąłem adres wraz z obiektem i przypisałem wskaźnikowi NULL.
Lecz dalej mam jeszcze jeden wskaźnik z adresem usuniętego już obiektu.
Pytanie jest teraz takie, jak sprawdzić czy ten adres w tym wskaźniku został usunięty.

2 odpowiedzi

0 głosów
odpowiedź 23 lutego 2017 przez criss Mędrzec (172,570 p.)

Nie ma takiej możliwości. Dlatego po zwolnieniu pamięci dobrą praktyką jest przypisanie do wskaźnika nullptr - wtedy można łatwo sprawdzić czy wskazuje na istniejący obiekt. 

PS:

oczywiście wskaźniki dynamiczne

 Raczej wskaźnik na dynamicznie zaalokowaną pamięć (obiekt)? "Dynamiczny wskaźnik" sugeruje raczej dynamicznie zaalokowany wskaźnik, ale i tak dziwnie brzmi.

usunąłem adres wraz z obiektem

Nie możesz usunąć adresu. Adres to wartość. Usuwasz (dealokujesz) obiekt - pamięć. 

komentarz 23 lutego 2017 przez Nekronomik Użytkownik (600 p.)
Tak, wiem ze nie da się usunąć adresu ale inaczej nie mogłem tego napisać :D
Tu jest problem taki że mam sporo adresów do obiektów które się nawzajem zabijają
np: obiekt 1 i obiekt 2 chcą zabić obiekt 3 ale obiekt 1 był pierwszy a obiekt 2 o tym nic nie wie i dobiera się do adresu obiektu 3 co wiadomo czym skutkuje.
komentarz 23 lutego 2017 przez criss Mędrzec (172,570 p.)
No to jest źle napisany kod po prostu :P
komentarz 23 lutego 2017 przez Nekronomik Użytkownik (600 p.)
Kod jest dobrze napisany, lecz muszę inne rozwiązanie znaleźć. Bo na tablicach obiektów ten sposób działał a na listach to obiekty są już usuwane.
komentarz 23 lutego 2017 przez criss Mędrzec (172,570 p.)

obiekt 1 i obiekt 2 chcą zabić obiekt 3 ale obiekt 1 był pierwszy a obiekt 2 o tym nic nie wie i dobiera się do adresu obiektu 3 

No nie - to nie jest dobrze napisany kod. Dobrze napisany != kompilujący się. Dobrze napisany to między innymi bezpieczny. 

0 głosów
odpowiedź 24 lutego 2017 przez draghan VIP (106,230 p.)

Jeśli mówimy o C++:

Nie używamy NULL, tylko nullptr. Zapoznaj się ze wskaźnikami inteligentnymi [sekcja "Smart Pointers"] i od dziś zacznij ich używać. Do tworzenia tablic służą w C++ kontenery. Zachęcam też do poczytania CppCoreGuidelines - nie jest to dokument dokończony, wciąż jest w trakcie tworzenia. Ale już w tej chwili zawiera wiele cennych wskazówek.

To, co opisujesz, to stworzenie tzw. 'dangling pointera'. Dość częsty błąd, szczególnie w dużych projektach o starej bazie kodu.

Jeśli mówimy o C:

...staraj się nie usuwać obiektów, jeśli wiesz, że wciąż wskazują na nie inne wskaźniki. Hej, a nie możesz zacząć pisać w C++? ;)

Podobne pytania

0 głosów
1 odpowiedź 362 wizyt
pytanie zadane 12 kwietnia 2018 w C i C++ przez Perseusz Bywalec (2,180 p.)
+2 głosów
2 odpowiedzi 887 wizyt
pytanie zadane 26 grudnia 2021 w C i C++ przez Dynamic Bywalec (2,910 p.)
0 głosów
1 odpowiedź 312 wizyt

93,771 zapytań

142,731 odpowiedzi

323,383 komentarzy

63,371 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...