Czy istnieje prosty, skuteczny wskaźnik słabo/bezpiecznie? Potrzebuję wielu wskaźników do tego samego obiektu, które są automatycznie ustawiane na wartość NULL po usunięciu obiektu. Istnieje jeden "główny" wskaźnik, który jest zawsze używany do usuwania obiektu, ale może istnieć kilka innych wskaźników, które odwołują się do tego samego obiektu.Prosty, skuteczny słaby wskaźnik ustawiony na wartość NULL po zwolnieniu pamięci docelowej
Oto kilka rozwiązań, które nie bardzo pasują do moich potrzeb:
- QPointer: Nie będę się tworzeniem aplikacji Qt; Nie chcę włączać tej biblioteki/pochodnej z QObject.
- boost::weak_ptr:
Wyjątek jest zgłaszany podczas uzyskiwania dostępu do obiektu przydzielonego. Zbyt droga w mojej sytuacji: test słabej wskazówki powinien być normalny; Planuję wykonać ręczne czyszczenie, gdy słaby wskaźnik przestanie być poprawny.aktualizacja: weak_ptr można testować bez rzucania wyjątków - Low-Overhead Weak Pointers: To jest bardzo blisko tego, co szukam, z wyjątkiem I nie podoba się fakt „Ten schemat jest gwarantowana jedynie pracować tak długo, jak don” t przydzielić 2 ** sizeof (int) razy w tej samej lokalizacji. "
Dlaczego muszę te słabe/strzeżone wskazówek: mam grę z listy obiektów do gier. Niektóre obiekty są zależne od innych, na przykład obiekt debugowania/statystyki powiązany z obiektem gry. Obiekt debugowania/stanu wyświetla przydatne informacje o obiekcie gry, ale ma sens tylko wtedy, gdy istnieje gra. Jeśli obiekt gry zostanie usunięty, obiekt debug/stats powinien to zrobić i usunąć sam siebie. (Innym pomysłem jest pocisk śledzący: zamiast usuwać się, może szukać nowego celu.)
Chcę zachować logikę debugowania/statystyk oddzielnie od encji gry. Obiekt gry nie powinien wiedzieć, że do obiektu dołączony jest obiekt debug/stats. Chociaż wolę odpowiedź dla słabych/strzeżonych wskaźników, z zadowoleniem przyjmuję także różne sposoby podejścia do mojego konkretnego zadania. Myślę, że być może będę musiał zaimplementować game object manager, który śledzi życiowe obiekty i używa uchwytów zamiast surowych wskaźników do adresów pamięci.
Pracuję w C++.
Ogólne pytanie brzmi: "czy Qt jest właściwym wyborem do stworzenia gry?" –
Słaby wskaźnik Boost pozwala sprawdzić, czy jest on ważny. Zgłasza wyjątek tylko wtedy, gdy próbujesz go bezpośrednio usunąć - podobnie do tego, co się dzieje, gdy próbujesz wyłuskać wskaźnik zerowy. – jalf
C++ 11 ma ['std :: weak_ptr'] (http://en.cppreference.com/w/cpp/memory/weak_ptr). Wygląda podobnie do tego z Boost. – Palec