为什么要在boost中添加指针

时间:2012-05-24 00:02:58

标签: c++ boost scoped-ptr

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

4 个答案:

答案 0 :(得分:4)

不是动态大小或类型。此外,可以交换范围指针,并且可以移动C ++ 11 unique_ptr,因此它们不是严格范围的。

答案 1 :(得分:4)

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

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

最后,要详细说明DeadMG的观点“如果它是动态类型”,您可以使用scoped_ptr来实现polymorphic操作:

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

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


另见:C++0x unique_ptr replaces scoped_ptr taking ownership?

答案 2 :(得分:2)

关键是你可以在某个词法范围内创建和清理指针。这在各种情况下都很有用,并且如果您明确使用delete,则会忘记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

答案 3 :(得分:1)

通常线程堆栈有内存限制(请参阅thread stacksize)。

有时指针可能已从外部传递给您,需要在此范围内删除(例如,如果抛出异常,则不会执行该行下面的任何删除调用)。所以你需要自动神奇地清理指针

void foo(Object*obj)
{
    //this will ensure that object gets cleaned up even if doFoo() throws an exception
    boost::scoped_ptr<Object> objCleaner(obj);
    obj->doFoo();
}