如何使用std :: auto_ptr作为函数的参数?

时间:2012-12-24 22:06:29

标签: c++ auto-ptr

我需要使用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)
}

或者也许我会自己释放内存而不是使用智能指针?如果是这样,怎么办?提前谢谢。

2 个答案:

答案 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_ptrstd::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提及。尽可能避免使用指针。