std::auto_ptr
jest zepsute w VC++ 8 (którego używamy w pracy). Moim głównym zarzutem jest to, że pozwala na auto_ptr<T> x = new T();
, co oczywiście prowadzi do strasznych awarii, a jednocześnie jest proste do zrobienia przez pomyłkę.Zastępowanie auto_ptr w VC++ 8
Z answer na inne pytanie tutaj na stackoverflow:
Należy zauważyć, że realizacja std :: auto_ptr w Visual Studio 2005 jest strasznie zepsuta. http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=98871 http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=101842
chcę użyć
boost::scoped_ptr
, dla wskaźników, które nie powinny przechodzić na własność.boost::shared_ptr
, dla wskaźników w kontenerach i innych miejscach, w których są wymagane.std::auto_ptr
, dla wskaźników, które powinny/mogą przekazywać prawa własności.
Ale ponieważ std::auto_ptr
jest podzielona na mnie, zastanawiam się, co byłoby najlepsze podejście:
- Wymień
std::auto_ptr
coś z siatki. Podoba mi się to this jeden z Rani Sharoni (jeszcze go nie wypróbowałem). - Zamiast tego należy użyć
boost::shared_ptr
. Oczywiście, że będzie działać, chociaż będzie trochę drobne, o które mnie nie dbam. Ale chcę użyćauto_ptr
, aby zasygnalizować zamiar wskaźnika. (Odpowiedz na głosowanie w sprawie tego podejścia, patrz: this). - Nigdy nie będę musiał przekazywać własności w praktyce, więc nie powinienem się o to martwić.
Aktualizacja: Oto co zrobiłem: skopiowane wspomnianą realizację auto_ptr przez Rani Sharoni. From here.
Czy drobne testy:
class T
{
public:
T() {
OutputDebugStringA("T\n");
};
~T() {
OutputDebugStringA("~T\n");
};
};
{
fix::auto_ptr<T> x(new T); // This just works.
}
{
fix::auto_ptr<T> x = (new T); // Doesn't compile. Great!
}
{
fix::auto_ptr<T> x = fix::auto_ptr<T>(new T); // Transfer of ownership works also.
}
Oczywiście te testy są w żaden sposób wyczerpujący i nie należy im ufać. Wdrożenie bezpiecznej dla wyjątków klasy szablonowej jest włochatym biznesem. Przynajmniej to działa lepiej niż wbudowane.
Uwaga: Nie wiem, czy mogę używać tej wersji jeszcze w odniesieniu do praw autorskich. Wysłałem e-mail do Rani i czekam na odpowiedź. Zaktualizuję ten wpis, gdy dowiem się więcej.
Pozwolenie jest przyznawane każdemu, aby mógł użyć implementacji auto_ptr Rani Sharoni.
Dziękuję za wszystkie odpowiedzi.
Podawanie własności nie jest czymś, co zdarza się często, ale zapewnia staranny sposób samodzielnej dokumentacji w ramach kodu. –
To jest dokładnie moja myśl. Uwielbiam autodokumentowanie kodu. –