当前位置:  技术问答>linux和unix

请教,使用malloc函数分配内存的问题!

    来源: 互联网  发布时间:2016-10-10

    本文导语:  在Linux下,想了解下内存分配,于是简单写了一个小逻辑,主要代码为: #define ONE_KB 1024 int main() {         char *p = NULL;         int count = 0;         while (1)         {                p = (...

在Linux下,想了解下内存分配,于是简单写了一个小逻辑,主要代码为:

#define ONE_KB 1024

int main()
{
        char *p = NULL;
        int count = 0;
        while (1)
        {
               p = (char*)malloc(ONE_KB);
               if (p != NULL)
               {
                      count++;
                      printf("%d KB Memory allocated !n", count);
                }
                else
                 {
                        sleep(5);
                        printf("Memory allocate error!");
                         exit(0);
                  }
        }
        exit(0);
}


运行的时候,通过资源管理器,可以看到这个程序的进程内存占用不断增大,最后因为内存不够程序自动退出,内存被释放。到这里大家都能理解。

但是我把程序修改一下,每次分配1MB的内存:

#define ONE_MB 1024*1024

p = (char*)malloc(ONE_MB);

这时运行的时候,从资源管理器里再查看进程内存情况,发现该进程内存只有几百来K,并且几乎不怎么增加,按理说应该快速以1MB的速度递增,但是内存几乎保持不便,从标准输出情况来看,内存不断被分配:

 printf("%d MB Memory allocated !n", count);

最终程序执行结束,可通过查看内存占用情况则明显没有被分配。


难道Linux在动态分配内存时,单次分配较小内存(比如1KB)时则直接分配真实内存,分配较大内存时则是虚拟的分配,即不直接分配真实的物理内存,而是分配一个地址,当真的需要用到该内存时才真正分配内存。 是这样的吗?搞不清楚,请高手指点。

|
首先,如果只使用malloc申请了一块内存,但没有使用它,那么Linux只为其分配一个虚拟空间(VmSize增大),实际的物理内存没有变化,而且分配时最小单位是4K。
当进程想glibc申请内存时,大于某个阈值(M_MMAP_THRESHOLD),glibc便会采用mmaps来为进程分配一块虚拟地址空间。小于这个值使用brk。缺省情况下是128K。可以通过下面函数来设置:
#include 
int mallopt(int param,int value)

上述内容摘自我提到的这本书,相信你的问题这本书里能找到答案。

|
malloc后memset(p,0xff,ONE_KB)试试。

    
 
 

您可能感兴趣的文章:

  • 高分请教:怎样在Kdevelop不能够Trace构造函数?(其他函数可以Trace)
  • 请教:javascript 里有没有时间循环执行的函数,如我按住鼠标触发mousedown 事件函数时,反复执行我写的一个函数?
  • 请教semop()函数的用法、含义
  • 请教套接字中的select()函数问题
  • 请教一个函数入口处的汇编问题(压栈问题)
  • 请教一个关于ftw函数的问题!
  • 100分请教高手一个bash函数
  • 请教signal函数的用法!
  • 请教exec系列函数的用法
  • 请教UNIX C字符输入的检测函数?
  • 请教关于dlopen,动态库连接程序的输出函数
  • 请教select函数
  • (菜鸟请教)还有修改/etc/passwd文件用什么函数呢?
  • linux下time函数问题请教高手
  • 请教一个网络编程问题,accept函数的,在线等,急。。。
  • 请教一个取时间的函数,急!!!!!!!!!!!!!!!!
  • 请教,JavaScript中能不能调用JSP写的函数?
  • 请教:clock_gettime函数的使用问题
  • 请教 变量= { function:函数名};什么意思
  • signal 函数请教
  • 请教一个关于内存分配的问题(系统和DMA共享一块物理内存空间)
  • 请教内存分配
  • 请教Linux内存分配策略与Windows有何异同?
  • 请教一个AIX下内存分配的问题
  • 请教ext4文件系统多块分配机制
  • 请教EXT4的block分配机制
  • 请教一个Linux内存分配的问题
  • 百分请教如何新建一个用户并为其分配权限?
  • 我有一个3CD的REDHAT7.2,请教如果完全安装,/,/root,/user,/home怎么分配大小?
  • 请教:在linux下如何为一个结构体分配空间?语句该怎么写?
  • Solaris内存分配问题请教
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)
  • 请教这种循环的执行过程
  • 请教两个redhat9问题
  • 请教如何在指定目录下查找包含指定文字的文件
  • 请教局域网中如何通过ip地址得到主机名
  • 请教kdevelop的问题
  • 请教linux 下的adsl拨号问题.
  • 请教,如何用虚拟订机安装liux
  • 【请教】LINUX 下SNMP的MIB开发
  • 请教一个opengl的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3