为什么在boost中使用范围指针

范围指针的目标是什么? 据我了解,范围指针管理一块代码中的内存。 如果我想在一个块内声明一个变量,我可以在堆栈中声明它,而不用担心清理。


不是如果它是动态大小或类型。 另外,范围指针可以被交换,并且在C ++ 11中unique_ptr可以被移动,所以它们不被严格限定范围。


与基于堆栈的数据不同,scoped_ptr有一个reset()成员 - 换句话说,您可以构建/破坏您心中的内容。 有了这个,你可以使用一个空指针(技术上的operator unspecified-bool-type )作为一个标志,指示在任何给定的时间是否有构造对象。 如果需要,它还允许您独立于变量范围对构建/销毁进行排序。

另外,请考虑您可以将scoped_ptr声明为类成员,而不仅仅是作为堆栈变量。 文档建议使用scoped_ptr来实现句柄/正文表达式(隐藏类的实现细节)。

最后,为了详细阐述DeadMG的观点:“如果它是动态类型的话,”你可以使用scoped_ptr来实现多态操作:

{
scoped_ptr<Base> a( mode ? new DerivedA : new DerivedB );
a->polymorphic_function();
}

通过简单的基于堆栈的分配来实现这一点是不可能的。


另请参见:C ++ 0x unique_ptr将取代scoped_ptr获取所有权?


关键是你可以创建和清理某个词汇范围内的指针。 这可以在各种情况下有用,并且它可以确保你没有内存泄漏,如果你明确地使用new ,忘记delete ,这是不推荐的。

您应该记住, boost::scoped_ptr不可复制的 ,并且在整个生命周期内完全拥有它的资源。 这也使得它更安全,然后boost::shared_ptr ,因为它避免了复制资源或意外分享它。

{ //Some Scope

  boost::scoped_ptr<int> i_ptr;
  // do something with pointer

} // leave scope, pointer is cleaned up
链接地址: http://www.djcxy.com/p/31643.html

上一篇: Why scoped pointers in boost

下一篇: Which is better: storing objects vs storing pointers?