- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
将对象传递给函数时,是否适用于智能指针和其他包含动态内存的对象一样的规则?
例如,当我通过 std::vector<std::string>
进入一个函数我总是考虑以下选项:
我要更改 vector 对象的状态,但我不希望在函数完成后反射(reflect)这些更改,AKA 制作拷贝。
void function(std::vector<std::string> vec);
我要更改 vector 对象的状态,并且我确实希望在函数完成后反射(reflect)这些更改,AKA 做一个引用。
void function(std::vector<std::string> & vec);
这个对象很大,所以我最好传递一个引用,但是告诉编译器不要让我改变它。
void function(std::vector<std::string> const& vec);
现在这与智能指针的逻辑相同吗?我什么时候应该考虑移动语义?一些关于我应该如何传递智能指针的指南是我最想要的。
最佳答案
智能指针具有指针语义,而不是值语义(嗯,不是你的意思)。想想shared_ptr<T>
作为 T*
;像这样对待它(好吧,除了引用计数和自动删除)。复制智能指针不会复制它指向的对象,就像复制 T*
不复制 T
它指向。
您不能复制 unique_ptr
一点也不。这个类的重点是它不能被复制;如果可以,那么它就不是指向对象的 unique(即:单数)指针。您必须通过某种形式的引用或通过移动它来传递它。
智能指针都是关于它们所指对象的所有权。谁拥有此内存,谁将负责删除它。 unique_ptr
代表唯一的所有权:只有一段代码拥有这 block 内存。您可以转让所有权(通过 move
),但这样做会失去内存的所有权。 shared_ptr
表示共享所有权。
在所有情况下,在参数列表中使用智能指针表示转让所有权。因此,如果一个函数采用智能指针,那么它将声明该对象的所有权。如果一个函数不应该拥有所有权,那么它根本不应该使用智能指针;使用引用( T&
),或者如果您需要可空性,则使用指针但永远不要存储它。
如果您传递给某人 unique_ptr
,您授予他们所有权。这意味着,根据唯一所有权的性质,您将失去内存的所有权。因此,几乎没有理由通过 unique_ptr
除了值(value)之外的任何东西。
同样,如果你想共享某个对象的所有权,你可以传入 shared_ptr
.你是通过引用还是通过值(value)来做这件事取决于你。由于您共享所有权,因此无论如何它都会复制(大概),因此您不妨按值(value)接受它。该函数可以使用std::move
将其移至类(class)成员等。
关于c++ - 如何将智能指针传递给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12519812/
我是一名优秀的程序员,十分优秀!