【发布时间】:2020-02-13 11:59:12
【问题描述】:
最近,我了解到 C++ 程序员之间的共识是,应尽可能避免使用 new、delete 和 delete[] 运算符,正如已经讨论过的 here、here 或 here .在搜索时,我什至偶然发现了一个April Fools' joke,指出这些运算符将在 C++20 中被弃用。
我碰巧编写和维护了一个用这种语言编写的 C/C++ 程序,以便继承其他程序员编写的有用库和类。由于它必须在非常有限的环境中运行(即,程序最少的旧 Linux 发行版),我不能依赖 C++11 和更高版本(例如smart pointers)带来的功能,我坚持到目前为止,在扩展我的程序时混合了 C 和 Java 编程习惯。其中,我经常使用new 和delete 的动态分配——这听起来当然是个问题。
为了方便未来的程序员维护我的代码,我想在我的代码中使用所述关键字来最小化动态分配。问题是我的程序必须管理一些用于(几乎)整个执行的相当大的数据结构。因此,我很难弄清楚为什么在这些情况下应该避免动态分配。
为简化起见,假设我有一个价值 10 兆字节的数据结构(建模为一个对象),它用于程序的整个执行,并且内存中的大小会随着时间的推移而增加。我的问题如下:
在这种特殊情况下,使用
new动态分配对象仍然是一种不好的做法吗?有哪些更好的选择?
1234563如果使用自动分配(如 here 所述),它是如何工作的?
非常感谢。
【问题讨论】:
-
向量已经在语言中使用了很长一段时间,并且通常可以很好地替代
new[]和delete[]。标准库的许多部分仅在头文件中实现,这意味着一旦您构建它,它们就是您程序的一部分,并且不依赖于外部库。 -
不幸的是,如果您生活在 C++03 世界中,您仍然会拥有
new和delete。不过,您可以将它们最小化。如果您需要集合,请使用向量而不是新建数组。您还可以编写自己的 RAII 智能指针,或查找已经这样做的库。new的大问题是您必须手动验证内存是否在每个控制路径中都已释放。这很痛苦,而且容易出错。以 RAII 方式隐藏资源分配和释放使您的代码不太可能出现这些错误。 -
不是问题的答案,而是您问题的替代解决方案。有时,如果值得麻烦,您可以为旧平台构建开发链以支持更新的语言标准。例如,我们正在为旧版 linux 目标(由客户强制要求)维护一个完全兼容 c++11 的构建环境,其原生开发环境仅部分兼容 c++11。
-
@NathanOliver 只是为了确保(也许我应该在我的声明中提到
vector;也许我稍后会编辑):假设我有一个价值几莫的数组(就是这种情况在实践中)。我将其替换为向量,而不使用动态分配(因此,在我的情况下,不使用new),它是另一个类的成员元素。如果我动态分配此类的一个实例,然后填充我的向量以在实践中与我以前的数组等效(同样,不使用元素的动态分配),所有内容都会存储在堆中,就像我手动管理数组一样? -
@je 是的。这是一张非常漂亮的“图片”:stackoverflow.com/questions/55478523/…
标签: c++ memory-management dynamic-memory-allocation