【发布时间】:2014-07-04 08:56:23
【问题描述】:
跟进这个问题Vector push_back only if enough memory is available,我试过了 在更一般的意义上重新表述这个问题。
考虑这个片段:
vector<double> v1;
cout << "pushing back ..." << endl;
while (true) {
try {
v1.push_back(0.0);
} catch (bad_alloc& ba){
cout << "bad_alloc caught: " << ba.what() << endl;
break;
}
}
关于上述代码片段,下列哪些说法是正确的?
1) 最终会到达 catch 块
2) 你无法事先确定是否有足够的内存让push_back 不抛出bad_alloc
3) catch 块中涉及内存分配的每个操作都可能失败,因为没有剩余内存了
我做的第一件事是在 Windows 上运行这个程序,这导致观察到在任何分页发生之前,bad_alloc 被抛出,因为显然已经超出了每个进程的内存量。这一观察导致了下一个陈述:
4) 在大多数操作系统上,bad_alloc 会在分页发生之前被抛出,但没有事先确定的方法。
经过一番研究,我对上述陈述提出了以下想法:
A1) 没错,catch 块将会到达,但可能不会在操作系统由于分页而执行密集的 I/O 操作之前。
A2) 没错,至少不是以独立于操作系统的方式
A3) 没错,您必须预先分配内存,以便对目前收集的向量中的数据做一些有用的事情(例如,如果您觉得这很有用,请自行进行一些分页)
A4) 没错,这取决于多个特定于操作系统的参数,例如每个进程的最大 RAM 量、进程优先级、操作系统进程调度程序的策略等...
我不确定 A1-A4 是否正确,因此是我的问题,但如果是,下面是下一个陈述:
5) 如果你需要编写一些算法并确保不会出现分页,请不要使用像std::vector 这样的动态数据结构。而是使用 Array 并确保它将使用特定于操作系统的函数(例如 mlockall (Unix))留在内存中
如果 5) 为真,它会导致最后一条语句:
6) 没有独立于操作系统的方法来编写不会导致分页的程序。
提前感谢大家分享您对上述声明的看法。
【问题讨论】:
标签: c++ memory memory-management data-structures out-of-memory