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

How to use std::auto_ptr as a parameter of function?

本文关键字:函数 形参 何使用 std auto ptr      更新时间:2023-10-16

我需要使用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)
}
或者我应该自己释放内存,而不是使用智能指针?如果有,该怎么做?

就是不要使用指针,即使是智能指针:

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");
}

编译器肯定会优化返回值拷贝,应用一个称为返回值优化的优化,所以你不应该担心。在这种情况下,与使用在堆栈上分配的对象并依赖于这种优化相比,使用指针来避免复制可能最终会变得更低效和乏味。

否则,考虑使用std::unique_ptr作为@templatetypedef提到的。尽量避免使用指针。

如果您有一个接受std::auto_ptr值的函数,那么无论您传递给该函数的std::auto_ptr将放弃对资源的控制并将其交给它调用的函数。因此,当函数返回时,原来的std::auto_ptr将不再指向它原来指向的资源。因此,你可以将std::auto_ptr视为"我将拿走你的资源并对其进行处理"。

要解决这个问题,可以考虑让函数通过引用获取std::auto_ptr,这样不会窃取引用。

但也就是说,您应该停止使用std::auto_ptr,而开始使用std::unique_ptrstd::unique_ptrstd::auto_ptr的更安全、更合理的替代品。如果不显式地使用std::move放弃对资源的控制,就不能按值传递std::unique_ptr,并且不会出现任何"gotcha!"风格的惊喜。

希望这对你有帮助!