我在这样的小函数中使用scoped_ptr。所以我不必调用删除。对于这种用法,这是否有点过分?我的团队成员更喜欢原始指针和删除。如果碰巧在非常关键的路径中使用scoped_ptr,那么使用它的成本是多少?这不应该是内联的,并且完全等同于在优化的二进制文件中使用普通删除吗?
void myfunc()
{
boost::scoped_ptr<myobj> objptr = someFactory::allocate();
callsomeotherfunc(objptr.get());
}
答案 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
,这两者对于您的特定用例都是等效的。至于它是否过度,不,它不是,它是提供异常安全的唯一选择(比如说myfunc
或callsomeotherfunc
抛出的代码中的任何内容,你想要释放内存)。性能方面,这三个选项相当于在不抛出异常的情况下在函数末尾调用delete
,并且比try/catch
块delete
更快。在异常情况下重新抛出异常。
此外,您似乎是从工厂分配,在某些设计中,工厂将需要调用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;
}
我知道我更喜欢写哪个版本......