这是使用G ++ 4.1.2在CentOS 64位上的C ++。
我们正在编写一个testing应用程序来加载系统上的内存使用量n千兆字节。 这个想法是整个系统的负载通过SNMP等得到监控。所以这只是一个行使监控的方式。
我们所看到的只是简单的做:
char* p = new char[1000000000];
不会影响所使用的内存,如top或free -m所示
Linux系统有限的插件架构?
Sigaction和移植Linux代码到Windows
为什么不是由Linux TAP设备处理的ARP或ICMPv6数据包
CreateMutex – “访问被拒绝”
FillConsoleOutputCharacter / WriteConsoleOutput和特殊字符
一旦内存被写入,内存分配似乎只会变成“真实”
memcpy(p,'a',1000000000); //shows an increase in mem usage of 1GB
但是我们必须写入所有的内存,只需写入第一个元素不会增加使用的内存:
p[0] = 'a'; //does not show an increase of 1GB.
这是正常的,有记忆实际上已经完全分配? 我不确定是否我们正在使用的工具(top和free -m)显示不正确的值,或者在编译器,运行时和/或内核中是否有巧妙的事情发生。
即使在closures优化的debugging版本中也可以看到此行为。
这是我的理解,一个新的[]立即分配内存。 C ++运行时是否延迟这个实际的分配,直到它被访问。 在这种情况下,可以将内存不足exception推迟到内存实际分配之后,直到内存被访问?
因为这对我们来说不是一个问题,但是知道为什么会发生这种事情是很好的!
干杯!
编辑:
我不想知道应该如何使用Vectors,这不是OO / C ++ /目前的做事方式等。我只是想知道为什么这样的事情是这样发生的,而不是有build议为尝试它的替代方式。
C#如何更换系统托盘时钟
如何在等待terminalinput的同时处理窗口事件?
叉100同时进行,有时一些进程变成僵尸
通过C ++中的迭代更新string
请查找过量使用。 Linux在默认情况下在访问之前不会保留内存。 如果你最终需要更多的内存,你不会得到一个错误,但是一个随机的进程会被终止。 你可以用/proc/sys/vm/*来控制这个行为。
国际海事组织,过度使用应该是一个过程设置,而不是一个全球性的。 并且默认不应该过度使用。
当您的程序库从操作系统分配内存时,操作系统将在进程的虚拟地址空间中保留一个地址范围。 没有理由让操作系统在你使用之前真正提供这个内存 – 就像你演示的那样。
如果你看eg /proc/self/maps你会看到地址范围。 如果您查看top的内存使用情况,您将看不到它 – 您还没有使用它。
关于你的问题的后半部分:
语言标准不允许拖延bad_alloc的任何延迟。 这必须作为新的[]返回一个指针的替代。 以后再也不会发生了!
一些操作系统可能会尝试过量分配内存,并在以后失败。 这不符合C ++语言标准。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。