我对智能指针很新,并试图重构一些现有代码以使用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 );
感谢。
答案 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() );
}