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

Using dynamic memory in the proper scope

我觉得在应该使用delete的相同范围内使用new是一个很好的做法。跟踪记忆要容易得多。例如,假设我有:

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
}

这样我就记得deleteo。但是,这也给我带来了问题。我目前正在处理一个更大的项目,我的 main() 开始看起来又大又乱,因为一堆语句可以很容易地组合在一个函数中。

那么在处理较大的项目(或与此相关的任何规模的项目)时我应该使用哪种做法,即我应该在 main() 中使用 new 以更好地跟踪内存但支付混乱代码的价格还是我应该在函数中使用 new 以获得更清晰的代码,但手动管理内存会稍微困难一些?

如果这个问题太具体或不如我想的那么重要,我深表歉意。

你是对的,传递指针使得跟踪所有权变得困难。如果您有权访问 C++11,则可以 return 和 std::unique_ptr 来表达将所有权传递给调用者的意图。 如果您只能访问 C++03 功能,boost 库也具有 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 对象...