c++ - 如何将智能指针传递给函数?

标签 c++ c++11 parameter-passing smart-pointers unique-ptr

将对象传递给函数时,是否适用于智能指针和其他包含动态内存的对象一样的规则?

例如,当我通过 std::vector<std::string>进入一个函数我总是考虑以下选项:

  1. 我要更改 vector 对象的状态,但我希望在函数完成后反射(reflect)这些更改,AKA 制作拷贝。

    void function(std::vector<std::string> vec);
    
  2. 我要更改 vector 对象的状态,并且我确实希望在函数完成后反射(reflect)这些更改,AKA 做一个引用。

    void function(std::vector<std::string> & vec);
    
  3. 这个对象很大,所以我最好传递一个引用,但是告诉编译器不要让我改变它。

    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/

相关文章:

c++ - 在 C++11 中的类中的不同方法之间共享 random_number_engine

c++ - 错误 : expected class-name before '{' token - can't seem to find any circular includes

c++ - 如何将 Lambda 函数作为参数传递

c++如何创建一个在终端和文件上打印的函数

c++ - 是否可以创建一个带有索引但没有指针的单链表?

c++ - 避免对 iOS 应用程序进行逆向工程,这可能吗?

c++ - 如何否定 lambda 函数结果

javascript - 如何将*参数*从 JS 传递到 AS3?

c++ - 为什么 std::shared_ptr<void> 起作用

c++ - HLSL:包装错误?