Mam aplikację C++, która szeroko wykorzystuje wskaźniki do utrzymywania dość skomplikowanych struktur danych. Aplikacja wykonuje symulacje matematyczne na dużych zbiorach danych (co może zająć kilka GB pamięci) i jest kompilowana przy użyciu programu Visual Studio 2010. Microsoft Visual Studio 2010.Pierwsze kroki z inteligentnymi wskaźnikami w C++
Obecnie przerabiałem ważną część aplikacji. Aby zmniejszyć błędy (zwisające wskaźniki, wycieki pamięci, ...) Chciałbym zacząć używać inteligentnych wskaźników. Poświęcanie pamięci lub wydajności jest dopuszczalne, o ile jest ograniczone.
W praktyce większość zajęć jest prowadzona w dużych pulach (jedna pula na klasę) i chociaż klasy mogą się nawzajem odnosić, można uznać pulę za właściciela wszystkich instancji tej klasy. Jeśli jednak pula zdecyduje się usunąć instancję, nie chcę, aby jakakolwiek inna klasa, która wciąż odnosi się do usuniętej instancji, miała zwisający wskaźnik.
W innej części przechowuję zbiór wskaźników dla instancji dostarczanych przez inne moduły w aplikacji. W praktyce pozostałe moduły zachowują własność przekazanej instancji, ale w niektórych przypadkach moduły nie chcą dbać o własność i po prostu chcą przekazać instancję do kolekcji, mówiąc "teraz jest twoje, zarządzaj nią".
Jaki jest najlepszy sposób na rozpoczęcie wprowadzania inteligentnych wskaźników? Zastępowanie wskaźników [losowo] za pomocą inteligentnych wskaźników nie wydaje się poprawne i prawdopodobnie nie zapewnia wszystkich (ani żadnych) zalet inteligentnych wskaźników. Ale jaka jest lepsza metoda?
Jakie typy inteligentnych wskaźników powinienem zbadać dalej? Czasami używam std :: auto_ptr do dealokacji lokalnie przydzielonej pamięci, ale wydaje się, że jest ona usunięta w C++ 0x. Czy std :: unique_ptr jest lepszą alternatywą? A może powinienem udać się bezpośrednio do wspólnych wskaźników lub innych typów inteligentnych wskaźników?
Wydaje się podobne pytanie, ale zamiast pytać, jakie to proste, pytam, jakie jest najlepsze podejście i jaki rodzaj inteligentnych wskaźników najlepiej pasuje.
Z góry dziękuję za pomysły i sugestie.
+1 dobra rada. Musisz wykonać * lot * tworzenia/niszczenia obiektów lub kopiowania wskaźników, aby zobaczyć różnicę w wydajności między 'shared_ptr' i' intrusive_ptr'. – Doug