10

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

4

4 回答 4

5

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

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

最后,为了详细说明 DeadMG 的观点“Not if it's of dynamic type”,您可以使用 scoped_ptr 来实现多态操作:

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

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


另请参见此处:C++0x unique_ptr replaces scoped_ptr getting Ownership?

于 2012-05-24T00:31:05.133 回答
5

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

于 2012-05-24T00:06:49.383 回答
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
于 2012-05-24T00:06:32.793 回答
1

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

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

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();
}
于 2012-05-24T00:08:33.023 回答