Why scoped pointers in boost

故事扮演 提交于 2019-12-21 03:58:09

问题


What is the objective of scoped pointer? to my understanding, the scoped pointer manages the memory within a block of code. If i want to declare a variable within a block , i can just declare it on a stack and not worry about cleaning.


回答1:


Not if it's of dynamic size or type. In addition, scoped pointers can be swapped, and in C++11 unique_ptr can be moved, so they're not strictly scoped.




回答2:


Unlike stack-based data, scoped_ptr has a reset() member -- in other words, you can construct/destruct to your heart's content. With this, you can use a null pointer (technically operator unspecified-bool-type) as a flag indicating whether or not there is a constructed object at any given time. It also allows you to sequence construction/destruction independently from the variable scope if that is needed.

Also, consider that you can declare a scoped_ptr as a class member, not just as a stack variable. The docs suggest using scoped_ptr to implement the handle/body idiom (to hide the class' implementation details).

Finally, to elaborate on DeadMG's point "Not if it's of dynamic type", you can use scoped_ptr to implement a polymorphic operation:

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

It's not really possible to do this with simple stack-based allocation.


Also see here: C++0x unique_ptr replaces scoped_ptr taking ownership?




回答3:


The point is that you can create and clean up a pointer within a certain lexical scope. This can be useful in a variety of situations, and it assures you have no memory leaks, by forgetting a delete if you were to use new explicitly, which is not recommended.

You should keep in mind that the boost::scoped_ptr is non-copyable, and so owns it's resource entirely, for the entire duration of it's lifetime. This also makes it safer then boost::shared_ptr, as it avoids copying the resource or accidentally sharing it.

{ //Some Scope

  boost::scoped_ptr<int> i_ptr;
  // do something with pointer

} // leave scope, pointer is cleaned up



回答4:


usually thread stacks have memory limits (see thread stacksize).

also sometimes the pointer might have been passed to you from outside and needs to be deleted in this scope (e.g. if an exception is thrown, any delete call below that line won't get executed). So you need someway of auto-magically cleaning up the pointer

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


来源:https://stackoverflow.com/questions/10729522/why-scoped-pointers-in-boost

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!