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