std::vector new 内存不足

Kan*_*bot 1 c++ vector out-of-memory stm32

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

我的情况

向量是这样的

struct Boundary{
  vector<unsigned short> x; //The x coordinates
  vector<unsigned short> y; //The y coordinates  
};
Run Code Online (Sandbox Code Playgroud)

每次我使用这些向量时我都会清除它们

boundary0.x.clear();
boundary0.y.clear();
Run Code Online (Sandbox Code Playgroud)

我用正常的push_back添加元素

奇怪的部分

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

“!啊,你的内存不够了!”- 你会说,但这就是奇怪的部分。到目前为止,向量只有 275 个元素,很短,只有 550 个字节。

但是这个程序可以毫无问题地处理具有更多元素(500 或更多)的相同向量。

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

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

k.v*_*.v. 5

您需要的是在使用并执行矢量后将矢量容量减少到其大小。clear

C++11解决方案:

使用shrink_to_fit()afterclear()函数释放之前分配的内存。

boundary0.x.clear();
boundary0.x.shrink_to_fit();
boundary0.y.clear();
boundary0.y.shrink_to_fit();
Run Code Online (Sandbox Code Playgroud)

它将把向量的容量减少到等于它的大小,然后clear()等于零。请注意,这是shrink_to_fit从 C++11 开始引入的。

C++03 及更早版本:

'Swap-to-fit' 习语可以用来达到相同的shrink_to_fit效果。

std::vector<T>(my_vector.begin(), my_vector.end()).swap(my_vector);
Run Code Online (Sandbox Code Playgroud)

将减少my_vector其容量。

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