Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
新[]不';在填充之前,不要减少可用内存 这是C++中的CCENS64位,使用G+4.1.2_C++_Linux_Memory Management_New Operator_Memory Overcommitment - Fatal编程技术网

新[]不';在填充之前,不要减少可用内存 这是C++中的CCENS64位,使用G+4.1.2

新[]不';在填充之前,不要减少可用内存 这是C++中的CCENS64位,使用G+4.1.2,c++,linux,memory-management,new-operator,memory-overcommitment,C++,Linux,Memory Management,New Operator,Memory Overcommitment,我们正在编写一个测试应用程序,以将系统上的内存使用量增加n GB。其思想是通过SNMP等监控整个系统负载,因此这只是一种实施监控的方法 然而,我们所看到的只是: char* p = new char[1000000000]; 不会影响top或free-m中所示的内存使用 内存分配似乎只有在写入内存后才会变为“真实”: memcpy(p, 'a', 1000000000); //shows an increase in mem usage of 1GB 但是我们必须写入所有的内存,简单地写

我们正在编写一个测试应用程序,以将系统上的内存使用量增加n GB。其思想是通过SNMP等监控整个系统负载,因此这只是一种实施监控的方法

然而,我们所看到的只是:

char* p = new char[1000000000];
不会影响top或free-m中所示的内存使用

内存分配似乎只有在写入内存后才会变为“真实”:

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)显示了不正确的值,还是编译器、运行时和/或内核中发生了一些聪明的事情

即使在关闭优化的调试版本中也可以看到这种行为

据我所知,一个新的[]立即分配了内存。C++运行时是否延迟了这个实际分配,直到后来访问它。在这种情况下,是否可以将内存不足异常延迟到实际分配内存之后很久,直到访问内存

事实上,这对我们来说不是一个问题,但如果能知道为什么会这样,那就太好了

干杯

编辑:


<>我不想知道我们应该如何使用向量,这不是OO/C++ +当前的做事方式等等。我只想知道为什么会这样,而不是有其他的方法来尝试它。

< p>当你的库从OS分配内存时,操作系统只会在进程的虚拟地址空间中保留一个地址范围。正如您所演示的,在您使用之前,操作系统没有理由实际提供此内存


如果查看例如
/proc/self/maps
,您将看到地址范围。如果您查看top的内存使用情况,您将看不到它-您还没有使用它。

请查看是否过度使用。默认情况下,Linux在被访问之前不会保留内存。如果最终需要的内存超过可用内存,则不会出现错误,但会终止一个随机进程。您可以使用
/proc/sys/vm/*
控制此行为


在我看来,Overmit应该是每个进程的设置,而不是全局设置。默认值应该是不过度限制。

关于问题的后半部分:

语言标准不允许在抛出错误的语言时有任何延迟。这必须作为new[]返回指针的替代方法。以后再也不会发生了


一些操作系统可能会试图过度分配内存,然后失败。这不是符合C++语言标准的。

我在这方面有一些经验,我认为现代编译器中的内存关联和垃圾收集方法也会影响这个问题。你有关于这方面的技术信息吗?C++中没有垃圾收集,这是没有关系的。但在java或C语言中,理论上这可能是另一个原因。有关详细信息,请从wikipedia的虚拟地址空间页面开始。我认为这是Unix的一个常见功能。这可能会导致地狱般的灾难,因为系统让你的应用程序相信它能够满足它的请求,但可能无法满足它的要求,但在实践中,我认为它会产生较低的内存消耗。@Matthieu:这是Linux特有的(过度限制)即使在那里,它也可以被禁用。@Nemanja:你可以在每个进程的基础上禁用它,还是一次对整个系统禁用它?