2

私はスマート ポインターを初めて使用し、既存のコードをリファクタリングして auto_ptr を使用しようとしていました。私が持っている質問は、それが理にかなっている場合、ダブルポインターとそれに相当する auto_ptr についてです。

ダブルポインターをパラメーターとして受け入れる関数があり、関数はそれにリソースを割り当てます。

void foo ( Image** img ) { ... *img = new Image(); ...}

この関数は、次のように使用されます。

Image* img = NULL;
foo ( &img );
...
delete img;


delete を明示的に呼び出す必要がないように、auto_ptr を使用したいと考えています。以下は正しいですか?

void foo ( auto_ptr<Image>* img ) { ... *img = auto_ptr<Image>(new Image()); ...}

その後

auto_ptr<Image> img = NULL;
foo ( &img );

ありがとう。

4

3 に答える 3

7

std::auto_ptr<>は奇妙なコピー セマンティクスを持ち (実際にはコピー セマンティクスではなく移動セマンティクスです)、多くの場合、スマート ポインターが必要なときに必要なものではありません。たとえば、STL コンテナーに入れることはできません。
標準ライブラリに TR1 サポートが付属している場合は、std::tr1::shared_ptr<>代わりに使用してください。(そうでない場合は、取得したものであるboost の を使用してください。)boost::shared_ptr<>std::tr1::shared_ptr<>

コードに固執したい場合は、非参照std::auto_ptr<>ごとに関数に渡すことができます。const

void foo ( std::auto_ptr<Image>& img ) { ... img.reset(new Image();) ...}

std::auto_ptr<Image> img;
foo ( img );
...
// no need to delete

または、ポインターを返すこともできます。

std::auto_ptr<Image> foo () {return std::auto_ptr<Image> img(new Image();)}
于 2010-04-29T08:02:03.383 に答える
0

あなたはリファクタリングしているので、さらに一歩進んで、パラメーターを戻り値に変換します。

// void foo( Image ** img )
std::auto_ptr<Image> foo() {
   std::auto_ptr<Image> tmp( new Image() );
   // ...
   return tmp;
}

インターフェイスから要件を削除したい場合でも (呼び出し元がコードを変更して他のタイプのスマート ポインターを自由に使用できるようにするため):

Image* foo() {
   std::auto_ptr<Image> tmp( new Image() );
   // ...
   return tmp.release();
}
int main() {
   std::auto_ptr<Image> ptr( foo() );
}
于 2010-04-29T08:32:41.593 に答える
0

それは、STL の auto_ptr の実装が「&」演算子をオーバーライドしてポインターからポインターを返すかどうかによって異なります (ほとんどのスマート ポインター クラスはそうする傾向がありますが、すべての auto_ptr 実装がそうするわけではありません)。

auto_ptr オブジェクトを渡すようにコードを書き直したい場合は、代わりに次のようなことを行う必要があります。これはより安全です。

void foo ( std::auto_ptr<Image> &img ) { ... img.reset(new Image()); ...}

std::auto_ptr<Image> img;
foo ( img );
于 2010-04-29T08:11:35.980 に答える