如何使用std::auto_ptr作为函数的形参
How to use std::auto_ptr as a parameter of function?
我需要使用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_ptr
。std::unique_ptr
是std::auto_ptr
的更安全、更合理的替代品。如果不显式地使用std::move
放弃对资源的控制,就不能按值传递std::unique_ptr
,并且不会出现任何"gotcha!"风格的惊喜。
希望这对你有帮助!
相关文章:
- 使用mem_fun_ref if成员函数需要多个形参
- 哪个模板形参在boost::shared_ptr构造函数中使用一个原始指针
- 如何在编译时通过模板形参默认值的名称/指针获取函数的类型
- 哪种方法更适合为函数提供编译时间常数?函数实参与模板形参
- 包含void*结构的函数的Const正确性和形参
- 将函数形参的实参解包到c++模板类
- c++ const函数形参.有没有一种方法可以只声明函数的单个签名?
- 关于将指向数组的指针作为函数形参的混淆
- 将非const引用使用auto-keyword声明的lambda作为实参传递给std::函数形参类型
- 作为函数形参传递的Vector初始化器列表
- 指向函数形参的指针vs函数形参
- 在模板化类和函数上下文中以默认值作为函数形参的函子:-)
- 带std::函数形参的重载操作符
- 作为Const引用的函数形参
- Const对象作为函数形参
- 函数形参中的指针
- 使用关键字作为C函数形参或c++模板参数
- 在不调用initializer_list构造函数的情况下,将不可复制、不可移动的类型构造为函数形参
- 模板类复制构造函数形参,带或不带模板实参
- c++中函数形参中的右值引用