首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >智能指针问题

智能指针问题
EN

Stack Overflow用户
提问于 2010-12-29 22:19:09
回答 4查看 536关注 0票数 4

我正在用智能指针重写我的代码。我有这样的情况:

代码语言:javascript
复制
void Foo(SomeClass *p) { }
boost::shared_ptr<SomeClass> p(new SomeClass);

现在该怎么做:从包装器(p.get())传递原始指针或重写函数参数,并直接传递智能指针,如下所示:

代码语言:javascript
复制
void Foo(boost::shared_ptr<Foo> obj) { }

我没有把握。据我所知,智能指针应该跟随一些指针,看看它在程序中是否还需要。所以我们可以传递原始指针。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-29 22:23:30

除非Foo需要取得(共享) *p的所有权,否则您应该保持签名不变,只传递p.get()。这是最简单、最灵活的选择,而且需要对现有代码进行最少的更改。

票数 5
EN

Stack Overflow用户

发布于 2010-12-29 22:36:26

如果您已经在重写代码以使用智能指针,那么您应该一直这样做,并尽可能地删除普通/原始指针。

智能指针不会使用某种魔法来跟踪其内容(就像垃圾收集器那样),但它们使用一个相当简单的启发式方法来确定是否应该释放它们控制的对象。不正确地使用智能指针很容易破坏这种启发式方法。

例如,shared_ptr跟踪制作的所有副本(直接或间接作为副本中的副本),并在销毁最后一个副本时销毁受控对象。如果您设法创建了两个shared_ptr,它们都控制同一个对象,但其中一个不是另一个的副本,这就会造成可怕的破坏。

票数 3
EN

Stack Overflow用户

发布于 2010-12-29 23:54:36

Foo的参数会为null吗?如果答案是否定的,那么你真的应该使用引用而不是指针:

代码语言:javascript
复制
void Foo(SomeClass &obj) { }

用法:

代码语言:javascript
复制
boost::shared_ptr<SomeClass> obj(new SomeClass);
Foo(*obj);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4554869

复制
相关文章

相似问题

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