无法使用新的[]CLinuxx86_64分配2-4 Gb的RAM

无法使用新的[]CLinuxx86_64分配2-4 Gb的RAM,第1张

概述对于这个简单的测试,以及带有4Gb或RAM的 linux机箱,0byte的交换和x86_64模式的CPU,我不能分配超过1 Gb的数组. 资源: #include <cstdio>int main(){ for(int i=0;i<33;i++) { char*a=new char[1<<i]; *a=1; delete[]a; printf("%d\n",i); f 对于这个简单的测试,以及带有4Gb或RAM的 linux机箱,0byte的交换和x86_64模式的cpu,我不能分配超过1 Gb的数组.

资源:

#include <cstdio>int main(){ for(int i=0;i<33;i++) {   char*a=new char[1<<i];  *a=1;  delete[]a;   printf("%d\n",i);  fflush(stdout); }}

跑:

$@R_301_6852@ testtest: ELF 64-bit LSB executable,AMD x86-64,version 1 (SYSV)$./test...24252627282930terminate called after throwing an instance of 'std::bad_alloc'  what():  St9bad_allocAborted

内存没有ulimit:

virtual memory          (kbytes,-v) unlimiteddata seg size           (kbytes,-d) unlimited

为什么错误?

Glibc是2.3.4,内核是2.6.9

更新:编译器是gcc4.1

谢谢!测试肯定有错误,1<< i给我高达31(2gb).此错误是无意的.但真正失败的代码是

for(j=0;j<2;j++)  for(i=0;i<25;i++)   some_array[j][i] = new int[1<<24];

所以实际代码中没有符号溢出.

int的大小是4个字节:

$echo 'main(){return sizeof(int);}'| gcc -x c - && ./a.out; echo $?4

每个请求将为1 <<< 24 * 4 = 1<< 26;所需的总内存是2 * 25 *(1 <26)3355443200字节50 * sizeof(指针),用于some_array 50 *(new []开销的大小).

解决方法 编辑:我在其他答案中看到,这个问题很可能与传递给new []的数字变成负面相关.我同意这种情况很可能就是这种情况,我只是因为我认为它包含的信息可能与某些类似情况相关,而问题不在于使用负数调用new [].

想到的第一个问题是你是否有足够的可用内存.使用4Gb RAM且无交换,可分配给所有进程和内核的内存总量为4Gb.

请注意,即使你有超过1Gb的内存可用于进程,malloc和free(在new []和delete []下面调用可能不会将内存返回给系统,并且实际上它们可能保留每个内存获取/释放的块的大小,以便程序的内存占用量可能高达2Gb(必须使用内核中的malloc实现来检查这一点,因为许多实现确实会返回大块).

最后,当您请求1Gb的数组时,您正在请求1Gb的连续内存,并且可能只是您拥有更多内存,但没有一个块足够大以满足该特定请求.

总结

以上是内存溢出为你收集整理的无法使用新的[]/C/Linux/x86_64分配2-4 Gb的RAM全部内容,希望文章能够帮你解决无法使用新的[]/C/Linux/x86_64分配2-4 Gb的RAM所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1236117.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存