首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将共享指针作为参数传递

将共享指针作为参数传递
EN

Stack Overflow用户
提问于 2012-05-31 09:59:57
回答 4查看 73.5K关注 0票数 95

如果我声明一个包装在共享指针中的对象:

代码语言:javascript
复制
std::shared_ptr<myClass> myClassObject(new myClass());

然后我想把它作为参数传递给一个方法:

代码语言:javascript
复制
DoSomething(myClassObject);

//the called method
void DoSomething(std::shared_ptr<myClass> arg1)
{
   arg1->someField = 4;
}

上面的代码只是简单地增加了shared_pt的引用计数,然后一切都变好了吗?或者它会留下一个悬空的指针?

你还应该这样做吗?:

代码语言:javascript
复制
DoSomething(myClassObject.Get());

void DoSomething(std::shared_ptr<myClass>* arg1)
{
   (*arg1)->someField = 4;
}

我认为第二种方法可能更有效,因为它只需要复制1个地址(而不是整个智能指针),但第一种方法似乎更具可读性,我不希望突破性能限制。我只想确定这里面没有什么危险。

谢谢。

EN

回答 4

Stack Overflow用户

发布于 2012-05-31 11:39:22

我认为人们不必要地害怕使用原始指针作为函数参数。如果函数不打算存储指针或以其他方式影响其生存期,则原始指针也同样有效,并代表最低公分母。例如,考虑如何通过值或常量引用将unique_ptr传递到以shared_ptr为参数的函数中?

代码语言:javascript
复制
void DoSomething(myClass * p);

DoSomething(myClass_shared_ptr.get());
DoSomething(myClass_unique_ptr.get());

将原始指针作为函数参数并不会阻止您在调用代码中使用智能指针,这一点非常重要。

票数 24
EN

Stack Overflow用户

发布于 2012-05-31 10:07:17

是的,关于shared_ptr<>的整个想法是,多个实例可以持有相同的原始指针,只有当shared_ptr<>的最后一个实例被销毁时,才会释放底层内存。

我会避免指向shared_ptr<>的指针,因为这与您现在再次处理raw_pointers的目的背道而驰。

票数 5
EN

Stack Overflow用户

发布于 2012-05-31 10:07:24

在您的第一个示例中按值传递是安全的,但是有一个更好的习惯用法。在可能的情况下传递const引用-即使在处理智能指针时我也会同意。您的第二个示例并没有完全失效,但它非常!???。愚蠢,什么也做不了,违背了智能指针的一部分,当你试图取消引用和修改东西时,会让你陷入痛苦的世界。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10826541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档