指向auto_ptr而不是经典双指针的指针

时间:2010-04-29 07:57:54

标签: c++ smart-pointers

我对智能指针很新,并试图重构一些现有代码以使用auto_ptr。我的问题是关于双指针和它们的auto_ptr等价物,如果这是有道理的。

我有一个接受双指针作为参数的函数,函数为它分配资源:

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

然后使用此函数:

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


我想使用auto_ptr来避免必须显式调用delete。以下是否正确?

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

然后

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

感谢。

3 个答案:

答案 0 :(得分:7)

std::auto_ptr<>具有奇怪的复制语义(实际上它是移动语义,而不是复制语义),并且在您需要智能指针时通常不是您想要的。例如,它不能放入STL容器中 如果您的标准库附带TR1支持,请改用std::tr1::shared_ptr<>。 (如果没有,请使用boost's 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();)}

答案 1 :(得分:0)

这取决于你的STL实现auto_ptr是否会覆盖'&amp;' operator返回一个指向指针的指针(大多数智能指针类都倾向于,但不是所有的auto_ptr实现都这样做。)

如果你真的想重新编写代码以传递auto_ptr对象,那么你应该做更像这样的事情,这会更安全:

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

std::auto_ptr<Image> img;
foo ( img );

答案 2 :(得分: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() );
}