在学习c ++时,我通常(经常)遇到以下建议:“尽可能避免动态内存分配;使用std :: vectors代替,因为它们会为您处理”。 / p>
所以我的问题是:什么时候必须使用动态内存分配?使用std::vector
可以使我完成的所有练习(我只是一个初学者)容易得多;但是,我的讲师强迫我们将动态记忆用于析构函数中的简单类(例如矩阵,几何矢量等)和delete[]
。
到目前为止,我发现new;delete[];
的唯一优势(或者至少是我告诉自己的自我感觉是值得使用动态内存的)是使用移动复制和移动分配。
答案 0 :(得分:5)
std::vector
还在后台进行动态内存分配(通过使用new
运算符)。
如您所见,here也为std::vector
定义了复制和移动分配,因此,手动进行操作不会提高速度。
可能您的问题是指您何时应该手动分配内存(通过显式使用new
和delete
),而不是依赖于另一个类(例如vector)为你做。
此问题的“现代C ++”答案是从不手动进行内存管理。
如果std::vector
完成了工作,请改用它。如果您需要分配单个项目,请使用std::unique_ptr
。
答案 1 :(得分:3)
在某些情况下,您可能需要实现自定义容器(因为std::vector
或任何其他标准库容器都不符合您的目的),在这种情况下,也许手动进行内存管理很有意义。
但是,除非您在某些工业级代码库中提供了低级核心组件并且有非常特定的目标,否则在这里也仍然没有必要进行手动内存管理。
我同意您的讲师的严格规定,因此有必要了解幕后发生的事情。您很少(如果有的话)应该必须使用手动内存管理,但这有助于了解std::unique_ptr
/ std::vector
(必须)的工作方式以便您理解C ++为何以这种方式构建。以一种在现实世界中有用的方式教授C ++最终将允许/强迫您使用标准库容器,因为(如您所正确注意到的那样)基本上没有理由编写delete
。
答案 2 :(得分:1)
讲师很可能会逼迫您,因此您可以了解事情的幕后运作方式。如前所述,std :: vector类可以为您处理所有动态内存管理,因此您无需编写所有代码即可自行处理。这很容易,尤其是对于初学者来说,在处理动态内存时会搞砸并且创建泄漏/忘记分配某些东西。
然而,向量并不是解决每个问题的解决方案,您可能会发现某些情况不能满足您所有的要求,在这种情况下,实现自己的数据结构可能会更好。