动态内存分配与类私有成员C++的 std::vector
Dynamic memory allocation vs std::vector for class private member C++
在学习 c++ 时,我通常(经常)遇到以下建议:"尽可能避免动态内存分配;改用 std::vectors,因为它们会为您处理此问题"。
所以我的问题是:什么时候必须使用动态内存分配?我做过的所有练习(我只是一个初学者)使用std::vector
要容易得多;尽管如此,我的讲师还是强迫我们将动态内存用于简单的类(如矩阵、几何向量等)和析构函数中的delete[]
。
到目前为止,我发现new;delete[];
的唯一优势(或者至少是我告诉自己的,以便觉得值得使用动态内存)是使用移动复制和移动分配。
std::vector
还在后台执行动态内存分配(通过使用new
运算符)。 复制和移动分配也为std::vector
定义,正如您在此处看到的,因此如果您手动执行此操作,则不会获得速度。
可能您的问题是指何时应该手动分配内存(通过显式使用new
和delete
),而不是依赖另一个类(例如 vector)为您分配。
这个问题的"现代C++"答案是永远不要手动进行内存管理。 如果std::vector
完成这项工作,请改用它。如果需要分配单个项目,请使用std::unique_ptr
。
在某些情况下,您可能需要实现自定义容器(因为std::vector
或任何其他标准库容器都不适合您的目的),在这些情况下,手动执行内存管理可能是有意义的。
但是,除非您在某些工业级代码库中提供低级核心组件并且具有非常具体的目标,否则在这里可能仍然不需要进行手动内存管理。
我同意你的讲师的严格规定,因为了解幕后发生的事情是值得的。您很少(如果有的话)应该使用手动内存管理,但它有助于了解std::unique_ptr
/std::vector
(必须)如何为您执行此操作,以便了解为什么C++是这样构建的。以在现实世界中有用的方式教授C++最终将允许/强制您使用标准库容器,因为(正如您正确注意到的那样)基本上没有理由编写delete
。
讲师很可能会强迫你,以便您了解引擎盖下的事情是如何运作的。您提到的 std::vector 类为您处理所有动态内存管理,这样您就不需要编写所有代码来自己处理这个问题。这很容易,尤其是作为初学者在处理动态内存时搞砸并创建泄漏/忘记释放某些内容。
然而,向量并不是每个问题的解决方案,你可能会发现它不适合你的所有标准 - 在这些情况下,最好实现你自己的数据结构。
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么 std::unique 不调用 std::sort?
- 使用std::函数映射对象方法
- 可组合的lambda/std::函数与std::可选