Jak sprawdzić, czy obiekt pod wskazywanym adresem wciąż istnieje?

0

Dobry wieczór. Zwracam się do Was z prośbą o radę.
Napisałem własną implementację grafu. Do tejże dodałem także iteratory po wierzchołkach oraz krawędziach. Iteratory te przechowują wskaźnik surowy do obiektu grafu, na który wskazują. Wszystko działa prawidłowo, ale chciałbym zabezpieczyć kod przed błędami użytkowników. W tym celu potrzebuję w każdej z metod iteratora w jakiś sposób sprawdzać, czy pod wskaźnikiem wciąż istnieje obiekt. W przykładowej sytuacji:

  1. Dynamicznie tworzę graf
  2. Tworzę iterator do tego grafu
  3. Usuwam graf
  4. Przy pomocy tego iteratora dokonuję próby odczytania zawartości usuniętego grafu

próbuję dostać się do adresu, który przechowuje śmieci lub jest aktualnie wykorzystywany przez inny proces. Gdyby nie przypadek grafu alokowanego na stosie (chyba, że jedynym sposobem utworzenia grafu byłaby metoda zwracająca std::shared_ptr), pewnie użyłbym std::weak_ptr (pytanie, jak to wpłynęłoby na szybkość działania - każda operacja wymagałaby "przeróbki" na std::shared_ptr).
Proszę o poradę, w jaki sposób mogę zapobiec takim sytuacjom.

1

Chodzi Ci o:

  1. Użytkowników-programistów, którzy będą używać Twojej implementacji grafu?
    Czy:
  2. Użytkowników, którzy będą korzystać z Twojej aplikacji operującej na grafach?

Bo jeśli to pierwsze, to Twoja przykładowa sytuacja jest IMHO nie do ominięcia...
Czy programista stosujący np. vector nie musi się pilnować, żeby nie używać utworzonego wcześniej iteratora do odczytania zawartości usuniętego vectora?

0

Mowa o użytkownikach - programistach. W pierwszym poście wspomniałem o moim pomyśle (tworzenie grafu tylko i wyłącznie przez faktorkę zwracającą std::shared_ptr oraz iteratory posiadające std::weak_ptr do grafu), ale raczej podejrzewam, że ucierpiałaby na tym wydajność. Każda operacja iteratora wiązałaby się z koniecznością wywołania std::lock() w celu sprawdzenia, czy graf wciąż istnieje. A to z kolei wiąże się ze stworzeniem std::shared_ptr, aktualizacją bloku kontrolnego, a potem destrukcją wcześniej wspomnianego wskaźnika i ponowną aktualizacją bloku kontrolnego. Pytanie, jak duży jest to koszt (ideą iteratora jest możliwie największa lekkość) i czy w ogóle warto go ponosić, zamiast zrzucić odpowiedzialność na użytkownika.

Po tych przemyśleniach doszedłem do takiego samego wniosku, jak Ty - jest to problem nie do ominięcia, a jak już, to kosztem optymalizacji. Dziękuję za pomoc :)

0

Jeśli graf nie ma być przetwarzany 60 razy na sekundę (np. przy jakiejś symulacji graficznej), czy też zawierać >100 węzłów, to chyba nie ma sensu tego przesadnie optymalizować.

0

Może warto jak popatrzysz na to i na to.

1 użytkowników online, w tym zalogowanych: 0, gości: 1