我希望这不是重复的(也感谢答案的链接)。 我有一个 C++ 应用程序,随着时间的推移,我会消耗大量内存。根据定义,不存在泄漏,因为所有内存仍然可访问(为此使用 valgrind)。然而,随着时间的推移,我的应用程序似乎使用越来越多的内存。
这让我想到了一个普遍的问题,例如
std::array<std::vector<std::string>, 4>
(或更具体地说是 std::array<std::vector<std::vector<cv::Mat>>, 4>
)如何工作(编译器根本不会抱怨)。
根据我的理解,std::array
需要在编译时具有固定的大小,因此如果其中一个容器或包含的数据类型调整大小,我如何首先从它定义一个std::array
?
其次:这可能是内存使用过多的原因吗?我通常将所有内容保留在本地,因此应该在运行时正确销毁它(多次检查),但也许调整“通常固定大小的容器”的大小可能会导致这种影响?
物体的大小永远不会改变。这意味着
std::vector
的大小永远不会改变。
std::vector
实际上并不包含其数据。它在堆上分配数据并保留指向其第一个元素的指针。该指针将是向量的一部分,而不是数据本身。因此,数据可能会调整大小(即堆上的新分配),向量不会改变(指针将简单地更新以指向新位置)。
使用
std::array<std::vector<T>, 4>
,您的数组包含 4 个向量,并且 4
在编译时是固定且已知的。
对于不断增长的内存使用量,内存泄漏并不是唯一可能的可能性。例如,如果您的程序不断向一个(或多个)向量提供新数据,您的内存消耗也会增加。
如果没有看到您的代码,我们无法判断。如果您还没有这样做,我建议您使用调试器单步执行代码并监视容器大小。