我正在尝试完成 Stroustrup 的 C++PL4 书中的一个练习。任务是:
分配大量内存使用 "new",以引发 "bad_alloc" 异常。报告分配了多少内存以及花费了多少时间。执行两次:一次不写入分配的内存,一次写入每个元素。
以下代码未抛出 "std::bad_alloc" 异常。执行程序后在终端中会看到 "Killed" 消息。
此外,以下代码退出约 4 秒钟。但是,当我取消注释内存使用消息时,程序却崩溃了。
分配大量内存使用 "new",以引发 "bad_alloc" 异常。报告分配了多少内存以及花费了多少时间。执行两次:一次不写入分配的内存,一次写入每个元素。
以下代码未抛出 "std::bad_alloc" 异常。执行程序后在终端中会看到 "Killed" 消息。
此外,以下代码退出约 4 秒钟。但是,当我取消注释内存使用消息时,程序却崩溃了。
// ++i;
// std::cout << "Allocated " << i*80 << " MB so far\n";
程序将运行几分钟。一段时间后,它会打印出已分配的大量内存,但我在系统监视器应用程序中没有看到太多变化。为什么会这样?
我使用Linux和系统监视器应用程序来查看使用情况。
#include <iostream>
#include <vector>
#include <chrono>
void f()
{
std::vector<int*> vpi {};
int i {};
try{
for(;;){
int* pi = new int[10000];
vpi.push_back(pi);
// ++i;
// std::cout << "Allocated " << i*80 << " MB so far\n";
}
}
catch(std::bad_alloc){
std::cerr << "Memory exhausted\n";
}
}
int main() {
auto t0 = std::chrono::high_resolution_clock::now();
f();
auto t1 = std::chrono::high_resolution_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(t0-t1).count() << " ms\n";
}
new
(以及malloc
或者是brk()
)并不一定会分配内存。它只是通过一系列层次向操作系统发送请求,而操作系统则分配一个虚拟内存区域(舍入到页面)。因此,只有访问给定页面才会执行内存分配。此外,现代操作系统允许“超额提交”,即分配更多的内存供不同应用程序之和使用,即使具有交换也一样。这是因为很少所有应用程序同时需要所有已分配的内存,并且可以按顺序服务它们的实际需求。 - user3159253bad_alloc
确实是一个坏主意,它可能会被引发,也可能不会,这取决于当前操作系统设置和应用程序在应用执行时的行为。 - user3159253