【问题标题】:boost shared_ptr use with default constructor使用默认构造函数提升 shared_ptr 的使用
【发布时间】:2012-06-21 20:59:27
【问题描述】:

我想我可能需要在我的应用程序中执行类似以下伪代码的操作:

boost::shared_ptr<T> p;
...
...
p = boost::shared_ptr<T>(new T);

我意识到使用赋值运算符还有其他选项,但我在boost::shared_ptr 文档/示例中注意到他们从未讨论过像这样涉及默认构造函数的案例。

我想我的问题是:这是有效的用途吗?换句话说,它是否合法,是否会导致潜在的内存泄漏?感谢任何想法/更正。非常感谢!

注意:我记得读过,正如下面的一些 cmets 所建议的那样,他们建议在使用 new 调用构造函数时始终使用命名的 shared_ptr。尽管如此,我还是很难想象这会造成任何伤害。如果您有任何反例,请发布它们。谢谢!

【问题讨论】:

  • 这违反了安全使用智能指针的第一条规则:"always use a named smart pointer variable to hold the result of new."(代码原样出现对我来说是安全的,因为operator= 被指定为不抛出. 但是,最好始终遵循此最佳实践。养成良好的习惯是件好事,它可以帮助您不必担心您的代码是否安全。)跨度>
  • 是的,我记得文档中的评论..因此是这个问题。不过似乎足够无害。这怎么会破坏任何东西?
  • @squashed.bugaboo : 与其说能够打破任何东西,不如说是惯用的和不令人惊讶的。
  • 我不知道它会破坏什么。我的脑力有限;遵循最佳实践有助于我不要浪费它。
  • 谢谢@James/ildjarn:很好,James :-) 会尝试遵循这一点,但我认为我必须重新编写代码以适应格言,我是争论这是否真的有必要。再次感谢!

标签: c++ boost shared-ptr


【解决方案1】:

这是完全合法且内存安全的。您在T 上调用默认构造函数这一事实无关紧要:只要您有一个动态分配的对象,您就可以将它包装在shared_ptr&lt;&gt;

如果你引用shared_ptr&lt;&gt;的默认构造函数也可以:包装后的指针为NULL,在分配另一个shared_ptr&lt;&gt;时不会被删除

您必须小心,但要检查内容是否为 NULL,否则您可能会访问无效指针

【讨论】:

  • 我已经选择了这个作为答案,因为我已经尝试过了,它对我有用,而且所有的地狱都没有松动。但我想承认它违反了使用 shared_ptr 所附的建议。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 2016-12-16
相关资源
最近更新 更多