问题描述
在一个c++程序中,程序会占用大量内存,5GB以上,在一个并行循环中出现了 0xC0000374: 堆已损坏的情况
具体是以下代码会报错 0xC0000374: 堆已损坏的情况。
std::vector Mzs(174,0.0f);
但是当我把报错代码替换成
float Mzs[174] = { 0.0f };
就不会出现0xC0000374: 堆已损坏的情况
原因分析:
在创建一个动态大小的向量,它会自动管理内存,包括在需要时扩容。当你提供初始容量时,即使向量只有固定大小,C++标准库仍然可能会预留一些空间以适应未来增长,这可能导致较大的内存分配。std::vector Mzs(174, 0.0f);
相比之下,是一个数组,它是在栈上分配的固定大小的连续内存。栈内存的管理是由编译器负责的,通常有较小的限制,并且不会像堆那样可能导致大块内存的分配和释放,所以在这个情况下不会触发堆已损坏的错误。float Mzs[174] = { 0.0f };
至于为什么数组不会引发这个问题,可能是因为数组分配的内存更为精确,不会像动态分配那样可能存在额外的空间分配和释放操作。此外,栈内存的处理机制也更简单,因此不容易导致堆损坏。
解决方案:
如果程序所占内存太大,考虑用c风格的数组分配地址
1万+

被折叠的 条评论
为什么被折叠?



