我觉得在应该使用的相同范围内使用new
是一个很好的做法delete
。跟踪内存要容易得多。例如,假设我有:
class Obj;
Obj* create() {
Obj* object = new Obj();
// do a bunch of messy work with object
return object;
}
int main() {
Obj* o = create();
}
上面代码的问题在于,需要释放o
并不是很明显。所以相反,我更愿意:
int main() {
Obj* o = new Obj();
// do a bunch of messy work with o
}
这样,我会记得delete
o
.但是,这也给我带来了问题。我目前正在做一个更大的项目,由于一堆语句可以很容易地组合在一个函数中,我的main()
开始看起来又大又乱。
那么,在处理较大的项目(或任何规模的项目(时,我应该使用哪种做法,即我应该在main()
中使用new
来更好地跟踪内存,但要付出混乱代码的代价,还是应该在函数中使用new
来获得更干净的代码,但在手动管理内存时稍微困难一些?
如果这个问题太具体或不像我想象的那么重要,我
您说得对,传递指针会使跟踪所有权变得困难。如果您有权访问 C++11,则可以返回 std::unique_ptr 来表达将所有权传递给调用方的意图。如果您只能访问 C++03 功能,则提升库也具有 boost::unique_ptr。
在适当的情况下使用 std::unique_ptr
std::shared_ptr
和 std::weak_ptr
还可以在异常处理发挥作用时简化内存管理(防止管理不善(。
使用 new
和 delete
在现代C++中几乎没有用处,除了编写自定义容器、分配器和其他较低级别的任务。
简而言之:尽可能使用智能指针,并在必要时使用手动内存管理。
最佳实践是永远不要直接使用new
- 使用为您管理内存的对象,例如std::string
和std::vector
,如果您真的需要类似指针的东西,请使用std::make_unique
和std::make_shared
来制作std::unique_ptr
或std::shared_ptr
对象...