这是使用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
从shell调用C函数(libcanberra)
请查找过量使用。 linux在默认情况下在访问之前不会保留内存。 如果你最终需要更多的内存,你不会得到一个错误,但是一个随机的进程会被终止。 你可以用/proc/sys/vm/*来控制这个行为。
国际海事组织,过度使用应该是一个过程设置,而不是一个全球性的。 并且默认不应该过度使用。
当您的程序库从 *** 作系统分配内存时, *** 作系统将在进程的虚拟地址空间中保留一个地址范围。 没有理由让 *** 作系统在你使用之前真正提供这个内存 – 就像你演示的那样。
如果你看eg /proc/self/maps你会看到地址范围。 如果您查看top的内存使用情况,您将看不到它 – 您还没有使用它。
关于你的问题的后半部分:
语言标准不允许拖延bad_alloc的任何延迟。 这必须作为新的[]返回一个指针的替代。 以后再也不会发生了!
一些 *** 作系统可能会尝试过量分配内存,并在以后失败。 这不符合C ++语言标准。
总结以上是内存溢出为你收集整理的新的不会减less可用内存,直到填充全部内容,希望文章能够帮你解决新的不会减less可用内存,直到填充所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)