Tre*_*key 17 c++ smart-pointers parameter-passing unique-ptr c++11
将对象传递给函数时,相同的规则是否适用于智能指针以及包含动态内存的其他对象?
例如,当我传递std::vector<std::string>给函数时,我总是考虑以下选项:
我将改变矢量对象的状态,但我不希望在函数完成后反映这些更改,AKA进行复制.
void function(std::vector<std::string> vec);
Run Code Online (Sandbox Code Playgroud)我要改变矢量对象的状态,我确实希望在函数完成后反映这些更改,AKA做出参考.
void function(std::vector<std::string> & vec);
Run Code Online (Sandbox Code Playgroud)这个对象非常大,所以我最好传递一个引用,但是告诉编译器不要让我改变它.
void function(std::vector<std::string> const& vec);
Run Code Online (Sandbox Code Playgroud)现在这与智能指针的逻辑相同吗?什么时候应该考虑移动语义?关于如何通过智能指针的一些指导是我最想要的.
Nic*_*las 24
智能指针具有指针语义,而不是值语义(嗯,不是你的意思).想想shared_ptr<T>作为一个T*; 这样对待(好吧,除了参考计数和自动删除).复制智能指针不会复制它指向的对象,就像复制a T*不复制T它指向的那样.
你根本无法复制unique_ptr.这个课程的重点是无法复制; 如果可以,那么它将不是指向对象的唯一(即:单数)指针.您必须通过某种形式的引用或移动它来传递它.
智能指针都是关于他们所指向的所有权.谁拥有这个记忆,谁将负责删除它.unique_ptr代表独特的所有权:正好一段代码拥有这个内存.您可以转移所有权(通过move),但这样做会失去对内存的所有权.shared_ptr代表共享所有权.
在所有情况下,在参数列表中使用智能指针表示转移所有权.因此,如果函数采用智能指针,那么它将声明该对象的所有权.如果一个函数不应该取得所有权,那么它根本不应该采用智能指针; 使用引用(T&)或者如果你需要可空性,指针但从不存储它.
如果你要传递某人unique_ptr,你就是给他们所有权.这意味着,凭借独特所有权的性质,您将失去对内存的所有权.因此,unique_ptr除了价值之外几乎没有理由通过任何东西.
同样,如果您想共享某个对象的所有权,则传入一个shared_ptr.无论您是通过引用还是按价值来做,都取决于您.既然你正在分享所有权,那么无论如何它都会制作一份副本(大概),所以你不妨按价值来看待它.该函数可用于std::move将其移动到类成员等中.
智能指针是一个引用另一个对象并管理其生命周期的对象。
传递智能指针需要尊重智能指针器支持的语义:
const smartptr<T>&是有效的(并且您不能更改指针,但可以更改它所指向的状态)。smartptr<T>&是有效的(并且您也可以更改指针)。smartptr<T>(通过复制)传递才有效。它适用于,但不适用于,除非您在调用时“移动”它,例如 in ,从而使 无效,将指针移动到传递的参数。(请注意,如果移动是临时的,则移动是隐式的)。std::shared_ptrstd::unique_ptrfunc(atd::move(myptr))myptrmyptrsmartptr<T>&&(通过移动)强制您在调用时移动指针,强制您显式使用std::move(但需要“移动”才能对特定指针有意义)。如果函数不会修改或复制指针,只需使用哑指针即可。智能指针用于控制对象的生命周期,但该函数不会改变生命周期,因此它不需要智能指针,并且使用哑指针为调用者使用的类型提供了一些灵活性。
void function(std::string * ptr);
function(my_unique_ptr.get());
function(my_shared_ptr.get());
function(my_dumb_ptr);
Run Code Online (Sandbox Code Playgroud)
unique_ptr 不能被复制,所以如果你必须传递它,你必须传递一个引用。