malloc内存泄露能分配多大内存

动态分配内存malloc和内存清零memset
malloc(动态内存分配),当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。
extern void *malloc(unsigned int num_bytes);
Malloc向系统申请分配指定size个字节的内存空间。返回类型是void*类型。void*表示未确定类型的指针。C,C++规定,void*类型可以强制转换为任何其它类型的指针。
在VC++6.0中它的头文件是malloc.h或者stdlib.h。
功能:分配长度为num_bytes字节的内存块。
返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。
malloc函数的工作机制
它的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿着连接表寻找一个大到足以满足用户需求的内存块。然后,将该块内存一分为二.接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切割成很小的内存片段,如果这时用户申请一个大的内存片段的,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对他们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。
将s所指向的某一块内存中的每一个字节的内容全部设置为ch指定的ASCII值,块的大小有第三个参数指定,这个函数通常为新申请的内存做初始化工作,其返回值为指向s的指针。
void *memset(void *s,int ch,size_t n);
函数解释:将s中前n个字节用ch替换并返回s;它的作用是在一段内存中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。  对这个问题的回答,就是一个字“是”或者“否”,而且表面看起来很容易回答成否。但是要真正回答清楚这个问题,涉及比较多的内容,我们不妨以此为起点,把相关知识关联起来。
  malloc()是C标准函数库中的一个函数,不管在哪个平台,它按需返回给我们申请的内存大小。但是,当我们在不同平台上去测试一下malloc()最多能分配多大内存空间时,结果可能完全不同,测试程序如下:
  #include &stdio.h&
  #include &stdlib.h&
  unsigned maximum = 24;
  int main(int argc, char *argv[])
  unsignedblocksize[] = {, 1024, 1};
  for(i=0; i&sizeof(blocksize)/sizeof(unsigned); i++ )
  { for( count = 1; ;count++ )
  { block = malloc( maximum +blocksize[i]*count );
  if( block!=NULL ) {
  maximum= maximum + blocksize[i]*
  free(block );
  }else {
  printf("maximummalloc size = %u bytesn", maximum);
  return0;
  1.在支持虚拟内存管理的操作系统上运行
  在Linux和Winidows环境下运行,返回结果约等于2.9G和1.9G,结果相差很大,为什么?
  下面以Linux操作系统为例对其进行分析。
  一个文件编译、链接后形成的可执行映像(32位系统上)如图所示:
  1)当请求分配的内存小于或等于128kb时,malloc()会调用系统调用brk()把指向堆起始地址的brk从数据段(.data)结束地址往高地址调整,分配的内存在堆区域。
  2)当请求的内存大于128kb,malloc()会调用mmap()分配一块内存,mmap是在进程的虚拟地址空间中(一般是堆和栈中间)找一块空闲的区域。
  从上图也可以看出,malloc()所分配的最大空间不仅与整个用户虚拟地址空间的大小有关(Linux是3GB,Windows是2GB),还与栈的大小,以及该程序数据段和代码段等占用的空间,以及连接程序链接方式等有关。
  malloc分配 的内存在虚拟地址空间,与物理内存没有直接的关系,当程序的第一条指令执行时,发生缺页中断,操作系统负责分配物理内存,并建立虚拟内存和物理内存之间的映射关系。因此,不管是在32位的Windows下还是Linux下,mallo(1.2G)都会分配成功。
  那么,问题来了,如果一个操作系统没有虚拟内存管理,malloc(1.2GB)会发生什么情况?
  2. 在不支持虚拟内存管理的实时操作系统上运行
  比如实时操作系统μLinux,就是 针对没有内存管理单元的 CPU 设计的, 所以不能使用处理器的虚拟内存管理技术。 虽然 μLinux 仍然采用存储器的分页管理,系统在启动时把实际存储器进行分页,在加载应用程序时按页加载,但由于没有 MMU 管理,所以 μLinux 采用实存储器管理策略。
  μLinux 系统对内存的访问是直接的, 所有程序中访问的地址都是实际的物理地址。 操作系统对内存空间没有保护,各个进程没有独立的地址转换表,共享一个运行空间。一个进程在执行前,系统必须为进程分配足够的连续地址空间, 然后全部载入主存储器的连续空间中,这种情况下,在只有1G物理内存的计算机上malloc(1.2G)就会失败。如果其他的实时操作系统不支持虚拟内存管理,那么同样的情况发生。
  ps: 在实际开发中,常常用tcmalloc()代替malloc() ,因为tcmalloc本身就是一个内存分配器,管理堆内存,主要影响malloc和free,用于降低频繁分配、释放内存造成的性能损耗,并且有效地控制内存碎片。
声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。malloc申请大内存报错分析_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
malloc申请大内存报错分析
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢malloc函数申请内存空间。动态申请的空间大小是看 内存? &内存有多大就能申请多大的空间? &1、看硬件的什么部件,硬件的物理内存大小? &2、 我在一个函数里申请4196字节的动态指针就死机了。请问这个是谁来控制的,大小又是谁来控制的?一个函数可以申请多大的动态指针空间?
回答1:动态申请的空间大小和两个因素相关,第一是虚拟存储的最大空间,32位系统是4g;第二是跟当时你的计算机中内存消耗情况和内存碎片的情况相关。申请4196字节的内存绝对不会造成死机,可能是你指针使用错误造成的。探讨动态申请的空间大小是看 内存? 内存有多大就能申请多大的空间? 1、看硬件的什么部件,硬件的物理内存大小? 2、 我在一个函数里申请4196字节的动态指针就死机了。请问这个是谁来控制的,大小又是谁来控制的?一个函数可以申请多大的动态指针空间?
回答2:对的,主要是由闲置的内存大小所决定的。可能是因为你申请的空间超过你的设备闲置内存容量了。
回答3:这个东西要从系统和进程上去看的.就当下常见的x64的windows来看.系统可以用的内存是 2的64次方字节,但是有一半的内存地址给系统本身用掉了,最低的一小部分用作开发测试用了.比如 0x0000 地址就不可以写,也不能读而进程之间,内存是隔开的.对于一个x64的进程而言,可以申请的内存大约是2的63次方字节.但是malloc出来的内存真的就实实在在的分配了么 当然不是,只有在这段内存真正被使用时才会真正进入ram.而且是通过内存页的方式加载的.如果是其它系统的情况,就要看其具体的系统来定了.如果是祼系统的,那就要看你的malloc函数是如何实现的了.
回答4:那就难说了,嵌入式系统的内存分配我不太清楚,系统提供的内存分配策略需要你自己研究。探讨我的设备不是计算机。
回答5:探讨malloc跟程序的堆栈的大小也有关系,你的堆栈都已经满了还怎么申请啊。C语言malloc分配的空间,超出为啥也能正常使用?
你好,想跟你请教个问题:
&&&&很不哈意思,老是麻烦您b( ̄▽ ̄)d……
&&&&做练习的时候,发现malloc函数分配的空间,超出了也能照样使用,突然就不能理解了,那还要realloc干啥。假如说,超出了malloc分配的空间就不能使用,需要动态增加空间的话,那么新增加的空间,不还是malloc上限后面的那几个吗?毕竟要分配一个连续的空间嘛,假如后面的空间正好被其他重要软件占用,那么realloc应该怎么分配出新的空间,换个地方?这样的话空间不就不连续了吗?越想越迷糊……求指点
& & 测试了一下,分配一个空间,可以压入一个字符串
# include &stdio.h&
# include &string.h&
# include &malloc.h&
int main( void )
str = ( char * )malloc( sizeof( char ) );
strcpy( str, "abcdef" );
puts( str );
--- 共有 1 条评论 ---
说的好有道理,我竟然无言以对
你超过访问的长度肯定能继续,但是你破坏了其他地址的数据(当然后面的地址也不一定有人用,有人用肯定是破坏了)。
malloc分配的空间肯定是连续的,realloc会先探测后面的空间够不够,如果够就直接开辟,如果不够他会找一个新的地方开辟你要的空间,然后把内存内容拷贝到新开辟的空间。
你的例子肯定是有问题的,只不过你不知道你到底影响了谁,111222假如这是内存的数据111是脏数据(111就是你分配的)你改成abcd后就是abcd22你的abcd访问是没问题,但是222的数据就被损坏了
--- 共有 1 条评论 ---
恩恩,您这么一讲解顿时就明白了,谢谢您了哈}

我要回帖

更多关于 malloc分配的内存在哪 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信