C++ 如何使用std::auto_ptr作为函数的参数?
我需要使用RAII成语,我做得对吗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
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从未初始化指针。