c++ - std::vector new 内存不足

标签 c++ vector out-of-memory stm32

我正在用 C++ 为嵌入式平台 STM32 编写程序。我曾经使用普通数组,但这是我第一次在其中使用 vector 。到目前为止,它在大多数情况下运行良好。然而,在极少数情况下,我得到了标题中所述的错误,尽管它不应该。当我的想法用完时,我将不胜感激。

我的情况

vector 是这样的

struct Boundary{
  vector<unsigned short> x; //The x coordinates
  vector<unsigned short> y; //The y coordinates  
};

每次我使用这些 vector 时,我都会用

清除它们
boundary0.x.clear();
boundary0.y.clear();

我用普通的 push_back 添加元素

奇怪的部分

有时,程序在向 vector 添加元素时以“Operator new out of memory”结束。

“!啊,你的内存用完了!” - 你会说,但这是奇怪的部分。到目前为止,该 vector 只有 275 个元素,短元素为 550 个字节。

但是这个完全相同的程序已经毫无问题地处理了具有更多元素(500 或更多)的相同 vector 。

不知何故,您之前泄露了内存!- 可以这么说,我怀疑是这样。也许我以前使用过它但未能清理它(尽管我按照我说的那样清理了它)但是即使当我断开并连接处理器以清除任何以前使用的内存时也会出现此错误。

我不知道为什么会发生这种情况。非常感谢任何帮助或评论或建议。

最佳答案

在使用 vector 并执行 clear 后,您需要将 vector 容量减少到其大小

C++11 解决方案:

clear() 函数之后使用 shr​​ink_to_fit() 释放之前分配的内存。

boundary0.x.clear();
boundary0.x.shrink_to_fit();
boundary0.y.clear();
boundary0.y.shrink_to_fit();

它将 vector 的容量减少到等于它的大小,在 clear() 之后等于零。 请注意,shr​​ink_to_fit 从 C++11 开始引入。

C++03 及更早版本:

'Swap-to-fit' 习语可用于具有与 shr​​ink_to_fit 相同的效果。

std::vector<T>(my_vector.begin(), my_vector.end()).swap(my_vector);

会将 my_vector 的容量减少到它的大小。

这里描述了这个成语并详细解释了它是如何工作的:https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Shrink-to-fit

关于c++ - std::vector new 内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44404952/

相关文章:

c++ - 如何访问 C++ 中的私有(private)嵌套类?

c++ - C++ Linux 中的命名管道检查缓冲区是否已满

c++ - CodeBlocks 函数参数自动完成快捷方式

c++ std::sort() 任何可比较成员仅使用一个比较函数的对象 vector

python - 如何将向量之间的欧氏距离转换为相似度分数

c++ - 二维 vector 打印

c# - Mutex 构造函数上出现此 OutOfMemoryException 的原因是什么?

android - OutOfMemoryError 当我使用 Recyclerview 加载大量图片时

android - Android 何时给出 OutOfMemory 异常?

c++ - 为什么编译器会尝试实例化一个我实际上并没有在任何地方实例化的模板?