如何分配大于1G的内存?

ophir 2008-12-13 11:04:28
byte *p = new byte[1G]

超过1G就不行了, 我想知道为什么? 我电脑是2G内存, 虚拟内存4G

目前我知道的是: new 是在堆上分配内存, 难道是操作系统对每个进程的堆大小有限制?
...全文
426 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2008-12-18
  • 打赏
  • 举报
回复
已经无数人重复地告诉过你了,系统因为内存碎片,已经没有连续的1g内存给你用了。
ophir 2008-12-18
  • 打赏
  • 举报
回复
谢谢你详细的回复,但我还是不懂。

我刚刚做了另外一个实验,如下:

char *q[2048];

for(int i=0; i<2048; i++) // 2G
{
q[i] = new char[1024*1024];//1M
}

for(i=0; i<2048;i++)
{
memset(q[i],10, 1024*1024);
}


每次申请1M,连续申请2048次,是可以申请的,但为什么我不可以一次申请1200M,或者1500M呢?

这里也有个帖子讨论这个问题,大家可以参考:
http://www.codeguru.com/forum/showthread.php?t=460605

cppbegginer 2008-12-17
  • 打赏
  • 举报
回复
楼主的是伪代码吧- -

我试过了
#include <iostream>
using namespace std;
int main()
{
char* p=new char[1024*1024*1024];
if(p==NULL)
{
cout < <"malloc failed" < <endl;
}
return 0;
}
可以成功
taodm 2008-12-17
  • 打赏
  • 举报
回复
汗,楼主啊,你自己试过几个编译器啊?竟然还能不成功。
ophir 2008-12-17
  • 打赏
  • 举报
回复
我是想分配超过1GB的内存,试试下面这个:
char* p= new char[1024*1024*1200];
能成功的来报个名。

另外:
byte *p = new byte[1G] 是伪代码,是给人看的,在机器上我不会这么写。
zhangjundriver 2008-12-13
  • 打赏
  • 举报
回复
我的能分配成功,但运行不会自动结束的,就是有bug,就不知道为什么了。代码如下:

int main()
{
char* p= new char[1024*1024*1024];
if(p==NULL)
{
std::cout << "malloc failed" << std::endl;
}
delete p;
return 0;
}

blackboycpp 2008-12-13
  • 打赏
  • 举报
回复
我也可以分配成功(我机器1G内存, winxp sp3), 但看任务管理器进程只占1MB多点的内存.
感觉是系统会智能管理这些的.
xuruichen 2008-12-13
  • 打赏
  • 举报
回复
我的机子上也可以分配成功,
#include <iostream>
using namespace std;
int main()
{
char* p=new char[1024*1024*1024];
if(p==NULL)
{
cout<<"malloc failed"<<endl;
}
return 0;
}
yshuise 2008-12-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyu637 的回复:]

void main()
{
char* p= new char[1024*1024*1024];
if(p==NULL)
{
cout < < "malloc failed" < < endl;
}
}
我的机器上能分配成功
[/Quote]
有bug
yellowhwb 2008-12-13
  • 打赏
  • 举报
回复
我电脑上分配1G的空间也能成功啊!
Leejun527 2008-12-13
  • 打赏
  • 举报
回复
好像跟操作系统和编译有关吧,我记得linux下用户空间程序的堆比windows下的大些。
nullah 2008-12-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyu637 的回复:]

void main()
{
char* p= new char[1024*1024*1024];
if(p==NULL)
{
cout < < "malloc failed" < < endl;
}
}
我的机器上能分配成功
[/Quote]
up
wuyu637 2008-12-13
  • 打赏
  • 举报
回复

void main()
{
char* p= new char[1024*1024*1024];
if(p==NULL)
{
cout << "malloc failed" << endl;
}
}
我的机器上能分配成功
门后面的猫 2008-12-13
  • 打赏
  • 举报
回复
Mark
weilin_wee 2008-12-13
  • 打赏
  • 举报
回复
int main()
{
char* p= new char[1024*1024*1024];
if(p==NULL)
{
std::cout < < "malloc failed" < < std::endl;
}
delete[] p;
return 0;
}
jixingzhong 2008-12-13
  • 打赏
  • 举报
回复
byte *p = new byte[1G]

看这名字,VC?

VC的编译选项中有 内存限制 选项,ms默认是100M吧,可以修改
codejian 2008-12-13
  • 打赏
  • 举报
回复
没全看懂,但是也明白了点!
ndchenxiaofeng 2008-12-13
  • 打赏
  • 举报
回复
跟你计算机内存当前使用的状况有关吧,可能分配的时候,内存中找不到一块1G大的连续的堆空间。找不到,操作系统就会进行内存整理,把一些零散的堆空间移到一块,但可能最后失败了。所以你的内存分配也就挫败了。
多试下吧,应该会成功的。
xuruichen 2008-12-13
  • 打赏
  • 举报
回复
谢楼上,现在才知道delete[] p是用来释放动态数组的。
shexinwei 2008-12-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xuruichen 的回复:]
delete[] p 什么作用和delete p有什么区别,不是删除指针吗?
[/Quote]
delete[] p用来释放动态的数组,delete p用来删除单个变量,怎么定义怎么释放,不能混用!
加载更多回复(6)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧