c++ - 推回范围内的 std::vector< std::vector> 最终耗尽所有内存
问题描述
如果您让下面的程序无限期地运行,它最终会耗尽所有 RAM 并且操作系统开始交换(在我的工作站中占用 64GB 大约需要 5 分钟)。如果这是真的,这里已经回答了:堆内存什么时候真正被释放?,那么为什么操作系统会进行交换而不是回收所谓的未使用的 RAM?
正如您在下面的代码中看到的那样,大向量应该在每个循环结束时被释放(超出范围)。所以,我希望程序一直占用相同数量的 RAM。
OBS:如果你的内存比较少,可以将nIter
数字设置为较低的数字。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int nIter = 700000000;
while(true){
std::vector< std::vector<double> > data;
data.reserve(nIter);
std::vector<double> dataLine( 7, 0.0 );
for( int i = 0; i < nIter; ++i ){
data.push_back( std::vector<double>() );
data.back() = dataLine;
}
} //End of scope.
return 0;
}
解决方案
推荐阅读
- gradle - Micronaut:某些包中的记录器未出现在 AWS lambda 和本地
- microsoft-graph-api - Outlook 联系人同步
- javascript - TypeError:图像构造函数:ReactNative 中需要“new”
- python - 如何根据其他几列填充一列?
- elasticsearch - ELASTICSEARCH - 根据值返回过滤字段
- javascript - 在组件内部调用组件本身
- javascript - 遍历对象数组以获取值
- css - 如何使用 CSS 渐变生成图像/SVG 文件
- r - 在条形图中使用新调色板时删除 R 中的原始颜色轮廓
- javascript - NestJS 在用玩笑测试方法之前访问私有类字段