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

Dynamic memory allocation vs std::vector for class private member C++

本文关键字:C++ std 成员 vector 分配 内存 动态      更新时间:2023-10-16

在学习 c++ 时,我通常(经常)遇到以下建议:"尽可能避免动态内存分配;改用 std::vectors,因为它们会为您处理此问题"。

所以我的问题是:什么时候必须使用动态内存分配?我做过的所有练习(我只是一个初学者)使用std::vector要容易得多;尽管如此,我的讲师还是强迫我们将动态内存用于简单的类(如矩阵、几何向量等)和析构函数中的delete[]

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

std::vector还在后台执行动态内存分配(通过使用new运算符)。 复制和移动分配也为std::vector定义,正如您在此处看到的,因此如果您手动执行此操作,则不会获得速度。

可能您的问题是指何时应该手动分配内存(通过显式使用newdelete),而不是依赖另一个类(例如 vector)为您分配。

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

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

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

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

讲师很可能会强迫你,以便您了解引擎盖下的事情是如何运作的。您提到的 std::vector 类为您处理所有动态内存管理,这样您就不需要编写所有代码来自己处理这个问题。这很容易,尤其是作为初学者在处理动态内存时搞砸并创建泄漏/忘记释放某些内容。

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