std::auto_ptr
VC++ 8 では壊れています (これは私たちが仕事で使用しているものです)。それに対する私の主な不満は、それが可能auto_ptr<T> x = new T();
であることです。これはもちろん恐ろしいクラッシュにつながりますが、誤って行うのは簡単です。
stackoverflow に関する別の質問への回答から:
Visual Studio 2005 での std::auto_ptr の実装はひどく壊れていることに注意してください。 http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=98871 http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=101842
使いたい
boost::scoped_ptr
、所有権を渡してはならないポインタ用。boost::shared_ptr
、コンテナー内のポインターおよびポインターが必要な他の場所。std::auto_ptr
、所有権を渡す必要がある/渡すことができるポインター用。
しかし、std::auto_ptr
私にとっては壊れているので、最善のアプローチは何でしょうか:
std::auto_ptr
ネットで拾ったもので代用。Rani Sharoni のこのようなもの(まだ試していません)。boost::shared_ptr
代わりに使用してください。もちろん機能しますが、私が気にしない小さなオーバーヘッドが発生します。auto_ptr
しかし、ポインターの意図を知らせるために使用したいと思います。(このアプローチに関する投票については、この回答を参照してください。)- 実際には所有権を渡す必要はないので、これについて心配する必要はありません。
更新: これが私がしたことです: Rani Sharoni による前述の auto_ptr 実装をコピーしました。ここから。
いくつかのマイナーなテストを行いました:
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.
}
もちろん、これらのテストは決して網羅的なものではなく、信頼すべきではありません。例外セーフのテンプレート クラスを実装することは、毛むくじゃらの仕事です。少なくとも、これは組み込みのものよりもうまく機能します。
注: 著作権に関して、この実装をまだ使用できるかどうかはわかりません。Rani にメールを送信し、返信を待っています。詳細がわかり次第、この投稿を更新します。
誰でも、Rani Sharoni の auto_ptr 実装を自由に使用することが許可されています。
返信ありがとうございます。