我正在用嵌入式平台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或更多)的相同向量而没有问题。
不知何故,你以前泄露了记忆! - 可以说,我怀疑。也许我之前使用过这个并且无法清理它(尽管我按照我的说法清理了它)但是即使断开并连接处理器消除以前使用过的任何内存,也会出现此错误。
我迷失了为什么会发生这种情况。任何帮助或评论或建议非常感谢。
答案 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
};