首先我注意到,当我malloc内存与calloc的内存占用是不同的。 我正在处理几个GB的数据集。 这个数据是随机的。
我期望我可以malloc大量的内存,并读取任何随机数据是在一个浮动。 然而,从进程查看器的内存占用情况来看,内存显然没有被声明(相比于calloc,我看到一个很大的脚印)。 我运行一个循环来将数据写入内存,然后我看到内存占用率攀升。 我是否正确地说,直到我初始化它之前,内存并没有被实际声明?
最后,我通过1024 * 1024 * 128字节(1024 MB的stream程查看器)后,我开始获得segfaults。 然而,Calloc似乎初始化了1 GB的全部数量。 为什么在初始化malloc的for循环的内存时出现segfaults,这个数字为128MB,为什么内存占用量是1024MB?
如果从内存malloc大量,然后从它读取我得到什么(因为进程查看器显示几乎没有足迹,直到我初始化)?
如何模拟C ++中的按键
在linux内核将页面写回到内存映射文件时捕获?
fseeko,fseeko64; ftello,ftello64 Visual C等价物
使用不同的表单调用已经打开的表单上的方法
为什么LD_PRELOAD似乎不能用wc写入
最后有没有办法让我分配超过4GB? 我正在testing内存层次结构性能。
代码#2:
long long int i; long long int *test=(long long int*)malloc(1024*1024*1024); for (i=0;i<1024*1024*128;i++) test[i]=i; sleep(15);
realv()在我的env不喜欢NulL作为第二个参数?
检测模拟键盘/鼠标input
在UWP中播放audio的最简单方法是什么?
如何使用x11窗口背景加载bmp文件
C ++:将__int64转换为无符号长整型
1-如果您正在使用32位计算机,则不能分配超过2GB的变量。
2-如果您正在使用64位计算机,则可以分配的RAM和交换内存的总数尽可能多,但是,将所有分配给一个变量需要一个可能无法使用的大块内存。 尝试一个链接列表,其中每个元素只有1 MB的分配,你可以实现总共分配更高的内存。
3-如你和Sharth所指出的,除非你使用你的内存,否则linux将不分配它。
一些说明:
正如注释,linux直到使用它才会真正分配内存。
当您使用calloc而不是malloc时,它会清除您请求的所有内存。 这相当于使用它。
#2因为sizeof(long long int) > 8或者你的malloc返回NulL而导致segfault失败。 如果您要求1 GB的RAM,这是非常可能的。
更多关于#2的信息 从你的128 MB的评论我得到的想法,你可能没有意识到发生了什么事情。 因为你把数组指针声明为long long int ,每个数组元素的大小是8个字节。 1024/8 == 128这就是为什么你的循环工作。 无论如何,当我尝试它时,它就这样做了。
你的例子代码中的for循环实际上是触摸1GB的内存,因为它是索引128 * 1024 * 1024 long long ,每long long是8个字节。
总结以上是内存溢出为你收集整理的Malloc内存问题全部内容,希望文章能够帮你解决Malloc内存问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)