Pin*_*Pin 2 c++ smart-pointers
我对智能指针很新,并试图重构一些现有代码以使用auto_ptr.我的问题是关于双指针及其auto_ptr等价物,如果这是有道理的.
我有一个接受双指针作为参数的函数,函数为它分配资源:
void foo ( Image** img ) { ... *img = new Image(); ...}
Run Code Online (Sandbox Code Playgroud)
然后使用此函数,如下所示:
Image* img = NULL;
foo ( &img );
...
delete img;
Run Code Online (Sandbox Code Playgroud)
我想使用auto_ptr来避免必须显式调用delete.以下是否正确?
void foo ( auto_ptr<Image>* img ) { ... *img = auto_ptr<Image>(new Image()); ...}
Run Code Online (Sandbox Code Playgroud)
然后
auto_ptr<Image> img = NULL;
foo ( &img );
Run Code Online (Sandbox Code Playgroud)
谢谢.
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
Run Code Online (Sandbox Code Playgroud)
或者你可以只返回指针:
std::auto_ptr<Image> foo () {return std::auto_ptr<Image> img(new Image();)}
Run Code Online (Sandbox Code Playgroud)