C++11 何时应将共享的_ptr作为原始指针传递?

C++11 何时应将共享的_ptr作为原始指针传递?,c++11,shared-ptr,smart-pointers,C++11,Shared Ptr,Smart Pointers,我在读关于共享指针应该如何传递的文章。 我遇到了这样一个州 准则:仅使用非常量共享参数来修改 共享\u ptr。仅当不需要时,才将常量shared_ptr&用作参数 确定你是否会复制并分享所有权;否则 改用widget*(如果不可为null,则使用widget&) 关于上述声明,我有两个问题 问题1: 它说 。。否则使用widget*(或者如果不可为null,则使用widget&) 这是否意味着如果我们有这样的东西 std::shared_ptr<foo> f = std::make

我在读关于共享指针应该如何传递的文章。 我遇到了这样一个州

准则:仅使用非常量共享参数来修改 共享\u ptr。仅当不需要时,才将常量shared_ptr&用作参数 确定你是否会复制并分享所有权;否则 改用widget*(如果不可为null,则使用widget&)

关于上述声明,我有两个问题

问题1:

它说

。。否则使用widget*(或者如果不可为null,则使用widget&)

这是否意味着如果我们有这样的东西

std::shared_ptr<foo> f = std::make_shared<foo>();
因此,使用它将是必要的

doSomething(f.get());
这是正确的吗?如果是这样的话,这不是很危险吗?如果f的参考计数变为0,那么ptr基本上是无效的?在哪种情况下,我希望创建一个接收原始指针的方法?为什么我要像那样传递一个智能指针

问题2 修改在这里是什么意思?如何修改共享指针

仅使用非常量shared_ptr&参数修改shared_ptr


我将试一试问题2:修改共享指针意味着分配不同的对象实例(并删除以前拥有的指针的所有权)

#包括
#包括
int
main(){
使用intptr=std::shared\u ptr;
intptr p=std::使_共享(5);
auto func=[](intptr&x){x=std::make_shared(6);};

std::cout所有这些都是简化代码和可读性的考虑因素,其中函数签名被用作函数用途的线索

如果函数在访问对象时需要指向对象的指针的共享状态,那么将其作为共享指针传递没有实际意义,除非函数打算获取其所有权。例如,函数
foo()
,带有签名

void  foo( std::shared_ptr<Object> p);  // it shares ownership
他们可以更改共享指针
p
所拥有的对象,也可以通过调用其
reset()
方法来更改-修改-指针本身。该指南提供对后者使用此方法,因为使用共享状态取消引用指针会带来成本。前一项任务可以通过原始引用轻松完成:

void  foo( Object& p);  // object may change but occupies same storage
.get()
的结果可以是
nullptr
,那个么原始指针是有意义的,否则受控对象最好通过引用传递

最后,常量引用允许创建另一个共享或弱指针或更改对象,但不允许修改原始指针。此签名表明foo()可以执行前者

void  foo(const shared_ptr<Object>& p); // p cannot be changed but may be shared
void foo(const shared_ptr&p);//p不能更改,但可以共享

指针的所有使用,无论是原始的、非拥有的还是智能的,如果使用不当都会被视为“危险”。因此,如果我们要在函数中使用.reset(),那么我们最好使用签名
void foo(Object&p);
但是如果我们要重新分配共享指针,那么就使用
foo(std::shared\u ptr&p)
我的理解正确吗?@MistyD什么?没有指针时如何使用重置?
reset()
成员是重新分配的方法之一,除了创建一个临时by
make\u shared
并分配它之外
void  foo( std::shared_ptr<Object>& p);  // new storage may be assigned
void  foo( Object& p);  // object may change but occupies same storage
void  foo(const shared_ptr<Object>& p); // p cannot be changed but may be shared