在简单的情况下使用scoped_ptr是不是矫枉过正
Is it an overkill to use scoped_ptr in simple cases?
我在这样的小函数中使用scoped_ptr。 这样我就不必调用删除。这是这种用法的矫枉过正吗?我的团队成员更喜欢原始指针和删除。如果这恰好在非常关键的路径中使用,使用scoped_ptr的成本是多少?这不应该是内联的,并且完全等同于在优化的二进制文件中使用普通删除吗?
void myfunc()
{
boost::scoped_ptr<myobj> objptr = someFactory::allocate();
callsomeotherfunc(objptr.get());
}
我不确定性能是否受到影响,但在此处使用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;
。
我不会为此目的使用scoped_ptr
,而是在 C++11 中unique_ptr
,在较旧的编译器中auto_ptr
,这两者都等效于您的特定用例。至于它是否矫枉过正,不,它不是,它是提供异常安全的唯一选择(在myfunc
或callsomeotherfunc
抛出的代码中说出任何内容,您希望释放内存(。在性能方面,这三个选项相当于在不引发异常的情况下在函数末尾进行delete
调用,并且比使用带有在发生异常时重新引发异常的delete
的try/catch
块更快。
此外,您似乎是从工厂分配的,在某些设计中,该工厂将具有需要调用的deallocate
操作,而不是delete
。如果是这种情况,您可以考虑使用不同的智能指针(与标准shared_ptr
,如果delete
是释放内存的正确方法,那将是矫枉过正的;或者一些短managed_ptr
,您也可以提供删除器(
不,不是。使用智能指针的好处(例如异常安全和自动资源清理(远远高于使用智能指针创建、维护和销毁所需的几个额外内存字节和几个额外 CPU 时钟的性能损失。
scoped_ptr用法是:
void myfunc()
{
myobj* objptr = someFactory::allocate();
try
{
callsomeotherfunc(objptr);
}
catch (...)
{
delete objptr;
throw;
}
delete objptr;
}
我知道我更喜欢写哪个版本...
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 在枚举类型上使用std::max是不是一种糟糕的做法
- std::元组大小,是不是错过了优化?
- 拥有相同方法的静态和非静态版本是不是设计不好
- 他是不是很贪婪
- SDL2:移动所有东西而不是使用视图端口是不是很糟糕
- OOP-我是不是把事情复杂化了
- 在DLL中分配内存并将其指针提供给客户端应用程序,这是不是一种糟糕的做法
- 在C++代码中使用C风格的注释是不是一种糟糕的做法
- 如果我在C++中使用堆,我是不是做错了什么
- 这个简单但有用的模式是不是太简单了,不可能成为一个真正的模式
- 在C++中,通过引用传递常量布尔值是不是不好的
- 在main.cpp中而不是在头文件中定义函数是不是一种糟糕的做法
- 既然智能指针已经存在,那么使用C型指针是不是已经过时了
- LNK2019:未解析的外部符号;我是不是忘了
- 重载一个函数同时获取指针或引用是不是一种糟糕的做法
- 是不是比较意味着一个分支
- 标准池:wstring.是不是这种做法太幼稚了
- 这是什么reinterpret_cast惯例?是不是比static_cast好