免責事項:この回答は、VS2005のようなバグのある実装でのauto_ptrの使用に純粋に適用できます。
auto_ptr
VS 2005で試した後、独自のビューを追加します。
私は過去に(このVC ++ 8で)auto_ptrを純粋なローカルコンテキストで正常に使用しました。つまり、次のようになります。
auto_ptr<T> local( ... ); // Don't use "=" to init! Will Crash on VS2005!
// use local
...
// Sometimes:
m_managing_object.setStuff( local.release() );
// Or, alternatively:
return local.release();
これは十分に機能し、問題が発生する可能性があるのは、initに割り当て構文を使用することだけでした。これは、毎回確実にクラッシュするため、大したことではありませんでした。
それで、他の人が言及した暗黙のセマンティクスに同意して、私は最初の例を機能させようとしました
auto_ptr<T> f() {
...
return new T();
}
...
auto_ptr<T> pT( f() ); // or "=" init??, Variations ...
...
失敗!
この些細な例を約1時間30分いじった後もauto_ptr
、このように使用すると毎回クラッシュする理由と正確さはわかりませんでした。
これはVS2005のバグのある実装によるものだと確信しています。つまり、バグのない実装では捕まえられたであろう完全に厄介なことをしたかもしれませんが、ここではクラッシュし、正しく理解できませんでした。
これはどういう意味ですか:これは、5年以上C ++でVS2005を使用していることを意味し、最も奇妙なシナリオでもデバッグにかなり自信があり、1時間以上経っても、間違ったことをいじくり回していませんでした。やがてわかったと思いますが、使いづらいものがあれば、使い切ってやりたいと思いshared_ptr
ます。地獄、生のポインタの戻り値でさえより良いです、少なくともあなたがそれで得る最悪のことはメモリリーク(簡単に検出できるもの)です。
したがって、VS2005でのauto_ptrの最も些細な使用例を除いてすべてを避けてください。