我需要使用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)
}
或者也许我会自己释放内存而不是使用智能指针?如果是这样,怎么办?提前谢谢。
答案 0 :(得分:4)
如果你有一个按值std::auto_ptr
的函数,那么你传入该函数的std::auto_ptr
将放弃对资源的控制并将其交给它调用的函数。因此,当函数返回时,原始std::auto_ptr
将不再指向它最初指向的资源。因此,您可以考虑按价值std::auto_ptr
来说明“我将把您的资源从您身边带走并用它做点什么。”
要解决此问题,请考虑让您的函数通过引用获取std::auto_ptr
,这不会窃取引用。
但是,您应该停止使用std::auto_ptr
并开始使用std::unique_ptr
。对于std::unique_ptr
,std::auto_ptr
是一个更安全,更明智的替代品。如果没有明确地使用std::unique_ptr
来放弃对资源的控制,你就无法按值传递std::move
,并且没有任何“陷阱!” - 风格的惊喜。
希望这有帮助!
答案 1 :(得分: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提及。尽可能避免使用指针。