在升压为什么范围的指针(Why scoped pointers in boost)

2019-07-29 12:27发布

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

Answer 1:

如果它是动态的尺寸或类型不。 此外,作用域的指针可以互换,而在C ++ 11 unique_ptr可以移动,所以他们没有严格的作用域。



Answer 2:

与基于堆栈的数据,使用scoped_ptr有一个复位()成员 - 换句话说,你可以构建/毁灭你的心脏的内容。 借助于此,就可以使用一个空指针(技术上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的取得所有权?



Answer 3:

问题的关键是,你可以创建和一定的词汇范围内清理的指针。 这可以在各种情况下非常有用,它可以确保你没有内存泄漏,被遗忘的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


Answer 4:

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

有时也指针可能是从外面传递给你,需要在此范围内被删除(例如,如果一个异常被抛出,该行下面的任何删除调用将不会执行)。 因此,你需要某种方式的自动神奇地清理指针

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


文章来源: Why scoped pointers in boost