为什么要在boost中添加指针

Jim*_*imm 10 c++ boost scoped-ptr

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

Pup*_*ppy 5

如果它是动态大小或类型,则不会。此外,作用域指针可以交换,并且在 C++11unique_ptr中可以移动,因此它们不是严格作用域的。

  • 这是 [一个旧线程](http://lists.boost.org/Archives/boost/2002/09/36359.php) 讨论了为什么 `swap` 成为一项要求(基本上,`scoped_ptr` 可以用作一个可复制的类)。 (2认同)

nob*_*bar 5

与基于堆栈的数据不同,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();
}
Run Code Online (Sandbox Code Playgroud)

简单的基于堆栈的分配来做到这一点是不可能的。


另请参见此处:C++0x unique_ptr 替换 scoped_ptr 获得所有权?


Ton*_*ion 2

要点是您可以在某个词法范围内创建和清理指针。这在多种情况下都很有用,并且通过忘记显式delete使用 if来确保您没有内存泄漏new,这是不推荐的。

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

{ //Some Scope

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

} // leave scope, pointer is cleaned up
Run Code Online (Sandbox Code Playgroud)