新向量的向量

Posted

技术标签:

【中文标题】新向量的向量【英文标题】:Vector of new vectors 【发布时间】:2021-03-18 12:43:27 【问题描述】:

假设我有一个动态分配的向量,例如:

std::vector<std::vector<double>*> map;

我必须手动释放 map 中的每个向量还是由向量析构函数本身自动释放它们? 如果我必须手动完成,这是一个好方法吗:

for(auto& t : map) delete[] t;

?

【问题讨论】:

是的,每次使用“new”时,都必须有一个关联的“delete”,这是规则。 一个好方法是有一个向量向量:std::vector&lt;std::vector&lt;double&gt;&gt;。或者,更好的是,如果您知道大小,将元素映射到一维向量(这将是最有效的)。如果您坚持使用指针向量,请使用std::vector&lt;std::unique_ptr&lt;std::vector&lt;double&gt;&gt;&gt;。但是,指向向量的指针很少有意义。 C++ never 自动释放指针。如果 C++ 有这样的规则,那么它还必须跟踪每个指针,以了解是否首先分配了以及现在释放是否安全(即其他地方没有指针的副本)。这会给 C++ 程序带来巨大的运行时负担。有类似的语言,但没有 C++。在 C++ 中,你管理内存,或者更好的是,让库代码为你做这件事。 “我有一个动态分配的向量”....为什么?为什么不只是一个向量的向量?您认为动态分配向量的附加价值是什么?无论如何,数据在内部都是动态分配的。 【参考方案1】:

您需要使用 delete 而不是 delete [] 来释放它们,因为向量不是数组。

但我看不出你为什么不使用的任何理由

std::vector&lt;std::vector&lt;double&gt;&gt;

这样你就不用担心向量的分配了

【讨论】:

我使用了动态向量,因为我将这些动态向量中的每一个传递给一个线程以 push_back 新元素,并通过动态分配来提高速度。但是当我尝试在这些动态向量上使用 delete[] 时,我遇到了一些错误。正如@DanielLangr 所建议的,我用智能指针替换动态向量,这应该是一种更安全的方式。 但是感谢您的回答,现在我知道总是删除[]新分配的对象【参考方案2】:

我必须手动释放 map 中的每个向量还是自动释放它们

如果您手动分配,那么您必须手动解除分配(除非您将所有权转移给智能指针,在这种情况下,您最好不应该首先手动分配)。

手动分配向量不是一个好办法。

【讨论】:

以上是关于新向量的向量的主要内容,如果未能解决你的问题,请参考以下文章

将一个向量交错和去交错成两个新向量

如何在 C++ 中从现有 2D 向量中创建具有特定列的新向量

如何将两个 Rust 向量按三个块交错成一个新向量?

在指针向量c ++中存储新对象

机器学习 - 支持向量机

Spark VectorSlice 向量切片