在简单的情况下使用scoped_ptr是否有些过分?

时间:2012-04-27 12:51:53

标签: c++ boost scoped-ptr

我在这样的小函数中使用scoped_ptr。所以我不必调用删除。对于这种用法,这是否有点过分?我的团队成员更喜欢原始指针和删除。如果碰巧在非常关键的路径中使用scoped_ptr,那么使用它的成本是多少?这不应该是内联的,并且完全等同于在优化的二进制文件中使用普通删除吗?

void myfunc()
{
  boost::scoped_ptr<myobj> objptr = someFactory::allocate();
  callsomeotherfunc(objptr.get());
}

4 个答案:

答案 0 :(得分:8)

我不确定性能是否受到影响,但在此使用scoped_ptr可确保myfunc()异常安全:如果callsomeotherfunc()抛出异常,则仍会释放动态分配的内存。如果未使用scoped_ptr并且callsomeotherfunc()可能会抛出,那么该函数的结构必须与此类似:

void myfunc()
{
    myobj* objptr = someFactory::allocate();

    try
    {
        callsomeotherfunc(objptr);
        delete objptr;
    }
    catch (const some_exception&)
    {
        delete objptr;
        throw;
    }
}

这很容易出错,因为函数的所有未来修改都需要确保在所有可能的出口点上调用delete objptr;

答案 1 :(得分:3)

我不会将scoped_ptr用于此目的,而是使用C ++ 11中的unique_ptr和旧编译器中的auto_ptr,这两者对于您的特定用例都是等效的。至于它是否过度,不,它不是,它是提供异常安全的唯一选择(比如说myfunccallsomeotherfunc抛出的代码中的任何内容,你想要释放内存)。性能方面,这三个选项相当于在不抛出异常的情况下在函数末尾调用delete,并且比try/catchdelete更快。在异常情况下重新抛出异常。

此外,您似乎是从工厂分配,在某些设计中,工厂将需要调用deallocate操作,而不是delete。如果是这种情况,您可能会考虑使用标准中的另一个智能指针(shared_ptr,如果delete是释放内存的正确方法,那将是过度的;或者{{1}您也可以提供删除

答案 2 :(得分:0)

不,它不是。使用智能指针(例如异常安全和自动资源清理)的好处远远高于使用几个额外字节的内存和几个附加CPU的性能损失智能指针创建,维护和销毁所需的时钟。

答案 3 :(得分:0)

我认为相当于scoped_ptr的用法是:

void myfunc()
{
  myobj* objptr = someFactory::allocate();
  try
  {
      callsomeotherfunc(objptr);
  }
  catch (...)
  {
      delete objptr;
      throw;
  }
  delete objptr;
}

我知道我更喜欢写哪个版本......