3

RAIIイディオムを使用する必要がありますが、正しく実行していますか?:

std::auto_ptr<std::vector<string>> MyFunction1()
{
   std::auto_ptr<std::vector<string>> arrayOfStrings;

   MyFunction2(arrayOfStrings); // work with arrayOfStrings

   return arrayOfStrings;
}

void MyFunction2(std::auto_ptr<std::vector<string>> array)
{
   auto_ptr<string> str;
   *str = "foo string";
   array.push_back(str)
}

または、スマートポインタを使用する代わりに、自分でメモリを解放する必要がありますか?もしそうなら、それを行う方法は?前もって感謝します。

4

2 に答える 2

4

std::auto_ptrby値をとる関数がある場合、std::auto_ptrその関数に渡すものはすべて、リソースの制御を放棄し、それが呼び出す関数に渡します。その結果、関数が戻ると、元の関数は元std::auto_ptrのリソースを指していなくなります。その結果、std::auto_ptr「私はあなたのリソースをあなたから奪い、それを使って何かをするつもりです」と言っているように、値で取り込むと考えることができます。

これを修正するには、関数が参照を取得するようにすることを検討してくださいstd::auto_ptr。これにより、参照が盗まれることはありません。

ただし、使用を中止して、代わりに 使用std::auto_ptrを開始する必要があります。のはるかに安全でより健全な代替品です。リソースの制御を放棄するために明示的に使用せずに値を渡すことはできません。また、「落とし穴」スタイルの驚きはありません。std::unique_ptrstd::unique_ptrstd::auto_ptrstd::unique_ptrstd::move

お役に立てれば!

于 2012-12-24T22:10:06.733 に答える
4

この場合、スマートなものでさえ、ポインターを使用しないでください。

std::vector<string> MyFunction1()
{
   std::vector<string> arrayOfStrings;
   MyFunction2(arrayOfStrings); // work with arrayOfStrings
   return arrayOfStrings;
}

void MyFunction2(std::vector<string> &array)
{
   array.push_back("foo string");
}

コンパイラは確実に戻り値のコピーを最適化し、 Return Value Optimizationと呼ばれる最適化を適用するので、心配する必要はありません。この場合、コピーを回避するためにポインターを使用すると、スタックに割り当てられたオブジェクトを使用してこの最適化に依存する場合と比較して、おそらくより非効率的で面倒になります。

それ以外の場合は、std::unique_ptr@templatetypedef メンションとして使用することを検討してください。ポインターはできる限り避けてください。

于 2012-12-24T22:19:33.390 に答える