在函数中分配shared_ptr

Tal*_*Tal 3 c++ smart-pointers

我需要创建一个返回已分配的shared_ptr变量的函数.这是正确的方法吗?

typedef boost::shared_ptr<std::vector<char> > sharePtr;

void createPtr(sharePtr &p)
{
    p = sharePtr(new std::vector<char>);
}

void test()
{
     sharePtr p;
     createPtr(p);
}
Run Code Online (Sandbox Code Playgroud)

ybu*_*ill 5

是的,这是正确的.但为什么不写只:

sharedPtr createPtr()
{
    return sharePtr(new std::vector<char>);
}

void test()
{
     sharePtr p = createPtr();
}
Run Code Online (Sandbox Code Playgroud)

?这可能比您的版本更快,并且使用支持移动语义的编译器更快.

它也建议使用make_shared而不是直接new:

sharedPtr createPtr()
{
    return make_shared<std::vector<char>>();
}
Run Code Online (Sandbox Code Playgroud)

因为它可以避免参考计数器的内存分配.

  • @Fabio:如果一个对象只被`weak_ptr`引用,而不是`shared_ptr`s,那么在单独分配的情况下,该对象将被删除,只保留管理节点(告诉`weak_ptr`s如果有人试图"锁定"它们中的任何一个,那么该对象就消失了.在包含对象和管理数据的单个分配的情况下,可以销毁该对象,但是不能释放该分配.所以更多的内存保持更长时间,直到所有的弱指针都消失了. (2认同)
  • @Fabio:这并不是那么糟糕.对于弱引用的大类,您可以(a)避免使用`make_shared`,(b)使用pimpl,(c)购买更多RAM,因此有很多选项.引用的对象可以在最后一次`shared_ptr`时调用它的析构函数,所以使用pimpl类(或`vector`)释放所有重要的东西,留下一个存根,可以稍微增加refcount节点的大小,但并不多. (2认同)