std :: vector new耗尽了内存

时间:2017-06-07 06:20:29

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

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

我的情况

矢量就像这样

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

每次我使用这些向量时,我都会用

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

我使用普通的push_back添加元素

奇怪的部分

有时,在向量中添加元素时,程序将以“运算符新内存不足”结束。

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

但是,这个相同的程序处理了具有更多元素(500或更多)的相同向量而没有问题。

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

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

2 个答案:

答案 0 :(得分:4)

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

C ++ 11解决方案:

shrink_to_fit()函数后使用clear()释放先前分配的内存。

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

它将减少向量的容量,使其等于clear()等于零之后的大小。 注意,从{+ C ++ 11开始引入shrink_to_fit

C ++ 03及更早版本:

&#39;交换到合适&#39;习语可以用来与shrink_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

答案 1 :(得分:2)

使用Vector::push_back向元素添加元素并且元素数量达到其初始容量时,将重新分配内部保留的缓冲区(即可以释放现有的缓冲区,并分配更大的内存块) )。这可能是&#34;片段&#34;你的内存,因为较小的可用内存块可用,但系统需要更大的块,如果系统内存相当低,它在某些时候可能找不到它。因此,如果您经常使用大量向量执行此操作,则可能会在嵌入式系统上出现问题。

很难说这是否真的是原因 - 但我尝试初始化矢量的容量很可能不会过度。也许这解决了你的问题。所以你可以试试:

struct Boundary{
    vector<unsigned short> x = vector<unsigned short>(500); //The x coordinates
    vector<unsigned short> y = vector<unsigned short>(500); //The y coordinates
};