在适当的范围内使用动态内存

Using dynamic memory in the proper scope

本文关键字:动态 内存 范围内      更新时间:2023-10-16

我觉得在应该使用的相同范围内使用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_ptrstd::weak_ptr 还可以在异常处理发挥作用时简化内存管理(防止管理不善(。

使用 newdelete 在现代C++中几乎没有用处,除了编写自定义容器、分配器和其他较低级别的任务。

简而言之:尽可能使用智能指针,并在必要时使用手动内存管理。

最佳实践是永远不要直接使用new - 使用为您管理内存的对象,例如std::stringstd::vector,如果您真的需要类似指针的东西,请使用std::make_uniquestd::make_shared来制作std::unique_ptrstd::shared_ptr对象...