为什么在提升中限定范围指针



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

如果它是动态大小或类型,则不会。此外,可以交换作用域指针,并且在 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

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

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

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();
}

最新更新