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

C++ 如何使用std::auto_ptr作为函数的参数?,c++,auto-ptr,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 MyFunct

我需要使用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::auto_ptr MyFunction1()
{
std::自动ptr阵列管柱;
MyFunction2(ArrayOfString);//使用ArrayOfString
返回数组字符串;
}
void MyFunction2(std::auto_ptr数组)
{
自动ptr str;
*str=“foo字符串”;
数组。推回(str)
}

或者我应该自己释放内存而不是使用智能指针?如果是,如何做到这一点?提前感谢。

如果您有一个函数按值接受一个
std::auto_ptr
,那么传递给该函数的任何
std::auto_ptr
都将放弃对资源的控制,并将其交给它调用的函数。因此,当函数返回时,原始的
std::auto_ptr
将不再指向它最初指向的资源。因此,你可以把一个std::auto_ptr的值看作是“我要把你的资源从你身上拿走,用它做点什么。”

为了解决这个问题,请考虑让您的函数按引用引用“<代码> STD::AutoPyPTR <代码>,它不占用引用。

但也就是说,您应该停止使用
std::auto_ptr
,而是开始使用
std::unique_ptr
std::unique_ptr
std::auto_ptr
更安全、更理智的替代品。如果不显式地使用
std::move
放弃对资源的控制,则无法按值传递
std::unique\u ptr
,而且它不会带来任何“gotcha!”式的惊喜


希望这有帮助

在这种情况下,不要使用指针,甚至不要使用智能指针:

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::vector MyFunction1()
{
std::向量数组字符串;
MyFunction2(ArrayOfString);//使用ArrayOfString
返回数组字符串;
}
void MyFunction2(标准::向量和数组)
{
array.push_back(“foo字符串”);
}
编译器肯定会优化返回值copy-away,并应用名为的优化,因此您不必担心这一点。在本例中,与使用堆栈上分配的对象并依赖此优化相比,使用指针来避免复制可能会导致效率更低、操作更繁琐


否则,请考虑使用<代码> STD::UnQuyGPPT/<代码> @ @ TePraceTyPyfFF。尽可能避免使用指针。

请注意:
std::auto_ptr
现在已不推荐使用。它试图在移动语义存在之前实现移动语义。请看一看正确的
std::unique\u ptr
。看一看
std::shared\u ptr
,这应该可以解决这个问题。+1但忽略了一个重要方面:OP从未初始化指针。