- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试从 Stroustrup 的 C++PL4 书中做一个练习。任务是:
Allocate so much memory using
new
thatbad_alloc
is thrown. Report how much memory was allocated and how much time it took. Do this twice: once not writing to the allocated memory and once writing to each element.
以下代码不会抛出 std::bad_alloc
异常。执行程序后,我在终端中收到消息“Killed”。
还有。以下代码在 ~4 秒后退出。但是当我取消注释内存使用消息时
// ++i;
// std::cout << "Allocated " << i*80 << " MB so far\n";
程序将运行几分钟。一段时间后,它打印出已经分配了 TB 的内存,但我没有看到系统监视器应用程序有太大变化。这是为什么?
我使用 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()
)并不一定会分配内存.它只是(通过层链)向操作系统发送请求,操作系统分配一个虚拟内存区域(四舍五入为系统内存页)。因此只有对给定内存的后续访问才能执行实际分配。
此外,现代操作系统允许内存“过度使用”。有时(取决于操作系统及其设置)应用程序可能需要完全更多的内存,操作系统甚至在理论上可以分配,包括它的所有交换区域等,所有这些都没有任何可见的问题。看at this page例如。
这样做是因为在现实生活中,所有应用程序实际上同时 使用所有分配的内存的情况是非常不可能的。更常见的是,99.99..% 的时间,应用程序只使用部分内存并按顺序执行,因此操作系统有机会无缝地满足它们的请求。
为了增加机会实际导致内存分配错误,您可以访问刚刚分配的元素,但我不会再一次将其称为逐字保证,只是“关于增加可能性”。
在最坏的情况下,当这样的操作系统实际上发现它无法分配足够的(虚拟)内存时,因为太多的应用程序同时请求访问它们无缝分配的数据,操作系统内存管理器启动一个称为“OOM killer”的特殊程序只是试探性地(= 随机 :))杀死选择的应用程序。
所以现在依赖 bad_alloc
是个坏主意。有时您可以可靠地接收它(例如,当人为地使用 ulimit/setrlimit 限制您的应用程序时),但通常您的应用程序将在无法保证任何事情的环境中运行。只是不要成为内存 pig 并为休息祈祷:)
关于c++ - 函数不会抛出 bad_alloc 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32678285/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!