类私有成员C ++的动态内存分配vs std :: vector

问题描述 投票:0回答:3

在学习c ++时,我经常(经常)遇到以下建议:“尽可能避免动态内存分配;使用std :: vectors代替它们为你处理”。

所以我的问题是:我何时必须使用动态内存分配?使用std::vector,我所做的所有练习(我只是一个初学者)都容易得多;然而,我的讲师强迫我们在析构函数中使用动态记忆来处理简单的类(如矩阵,几何向量等)和delete[]

到目前为止我为new;delete[];找到的唯一优势(或至少我告诉自己为了感觉值得使用动态内存)是使用移动复制和移动分配。

c++ vector heap-memory
3个回答
3
投票

在某些情况下,您可能需要实现自定义容器(因为std::vector和任何其他标准库容器都不适合您的目的),在这些情况下,手动执行内存管理可能是有意义的。

但是,除非您在某些工业级代码库中提供低级核心组件并且具有非常具体的目标,否则此处可能仍然不需要进行手动内存管理。

我同意你的讲师的严格规定,因为理解幕后发生的事情是值得的。你很少,如果有的话,应该使用手动内存管理,但它有助于理解std::unique_ptr / std::vector(必须)如何为你做这件事,以便理解为什么C ++按照它的方式构建。以现实世界中有用的方式教授C ++最终会允许/强迫您使用标准库容器,因为(正如您正确注意到的那样)基本上没有理由编写delete


5
投票

std::vector也在幕后进行动态内存分配(通过使用new运算符)。复制和移动分配也是为std::vector定义的,因为你可以看到here,所以如果你手工完成它就没有速度。

可能你的问题是指你何时应该手动分配内存(通过明确使用newdelete),而不是依靠另一个类(如vector)来为你做。

这个问题的“现代C ++”答案是永远不要手工进行内存管理。如果std::vector完成这项工作,那就改用它。如果您需要分配单个项目,请使用std::unique_ptr


1
投票

讲师最有可能强迫你,让你了解事情是如何运作的。您提到的std :: vector类为您处理所有动态内存管理,这样您就不需要编写所有代码来自行处理。这很容易,尤其是作为初学者,在处理动态内存并造成泄漏/忘记解除分配时会搞砸。

然而,向量不是解决每个问题的解决方案,并且您可能会发现它不适合所有标准的情况 - 在这种情况下,实现自己的数据结构可能更好。

© www.soinside.com 2019 - 2024. All rights reserved.