3

C++03 環境では、関数からリソースを返すために、auto_ptrまたは (ブースト)を使用しますか? shared_ptr(C++11 では当然 a を使用しunique_ptrます。)

auto_ptr<T> f() {
  ...
  return new T();
}

また

shared_ptr<T> f() {
  ...
  return new T();
}

auto_ptrかなりの落とし穴があります(少なくとも、私が使用しなければならないMSVC 2005では構造が非常にバグが多いということではありません)が、shared_ptrやり過ぎのようです...

4

3 に答える 3

6

C++03 では、ベア ポインターまたは のいずれかを使用してauto_ptr、呼び出し元に所有権戦略を決定させます。

スマート ポインターの落とし穴の 1 つは、共分散が適用されBase* f()ないDerived* f()ことstd::x_ptr<Base> f()ですstd::x_ptr<Derived> f()。したがって、この場合、単純なポインターを使用するしかありません。

于 2013-02-15T11:09:22.313 に答える
1

悪い考えと見なされるshared_ptrため、または生のポインターを使用します。auto_ptr

それは本当に所有権のセマンティクスに依存します。所有しているリソースを破壊するのは誰ですか?

于 2013-02-15T11:03:38.440 に答える
0

免責事項:この回答は、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の最も些細な使用例を除いてすべてを避けてください。

于 2013-02-19T10:19:33.147 に答える