新向量的向量
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<std::vector<double>>
。或者,更好的是,如果您知道大小,将元素映射到一维向量(这将是最有效的)。如果您坚持使用指针向量,请使用std::vector<std::unique_ptr<std::vector<double>>>
。但是,指向向量的指针很少有意义。
C++ never 自动释放指针。如果 C++ 有这样的规则,那么它还必须跟踪每个指针,以了解是否首先分配了以及现在释放是否安全(即其他地方没有指针的副本)。这会给 C++ 程序带来巨大的运行时负担。有类似的语言,但没有 C++。在 C++ 中,你管理内存,或者更好的是,让库代码为你做这件事。
“我有一个动态分配的向量”....为什么?为什么不只是一个向量的向量?您认为动态分配向量的附加价值是什么?无论如何,数据在内部都是动态分配的。
【参考方案1】:
您需要使用 delete
而不是 delete []
来释放它们,因为向量不是数组。
但我看不出你为什么不使用的任何理由
std::vector<std::vector<double>>
这样你就不用担心向量的分配了
【讨论】:
我使用了动态向量,因为我将这些动态向量中的每一个传递给一个线程以 push_back 新元素,并通过动态分配来提高速度。但是当我尝试在这些动态向量上使用 delete[] 时,我遇到了一些错误。正如@DanielLangr 所建议的,我用智能指针替换动态向量,这应该是一种更安全的方式。 但是感谢您的回答,现在我知道总是删除[]新分配的对象【参考方案2】:我必须手动释放 map 中的每个向量还是自动释放它们
如果您手动分配,那么您必须手动解除分配(除非您将所有权转移给智能指针,在这种情况下,您最好不应该首先手动分配)。
手动分配向量不是一个好办法。
【讨论】:
以上是关于新向量的向量的主要内容,如果未能解决你的问题,请参考以下文章