使用malloc函数分配内存后不释放会对电脑有影响吗 | 不断增加物理内存,能够增加malloc的内存大小吗

使用malloc函数分配内存后不释放会对电脑有影响吗 | 不断增加物理内存,能够增加malloc的内存大小吗

1. 不断增加物理内存,能够增加malloc的内存大小吗

在堆中分配的内存如果不用free释放,就会在程序运行结束前一直存在于堆中,造成内存泄露。

但结束程序后,操作系统会回收该进程的内存空间,该进程存储在物理内存的所有内容消失了,包括以前泄漏的。

2. malloc分配的是虚拟内存还是物理内存

个人感觉这里的堆 应该指的是heap而非数据结构中的堆。

栈区(stack)— 由编译器自动分配释放 ,存放函数参数值,局部变量的值等。

其操作方式类似于数据结构中的栈。

堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。区别和联系:

1.申请方式 堆是由程序员自己申请并指明大小,在c中malloc函数 如p1 = (char *)malloc(10); 栈由系统自动分配,如声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间2.申请后系统的响应 栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。 堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会 遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内 存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。

另外,由于找到的堆结点的大小不一定正好等于申请的大 小,系统会自动的将多余的那部分重新放入空闲链表中。

3.申请大小的限制 栈:在Windows下,栈是向低地址扩展的数据结 构,是一块连续的内存的区域

这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是 一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。

因此,能从栈获得的空间较小。 堆:堆是向高地址扩展的数据结构,是不连续的内存区域。

这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。

堆的大小受限于计算机系统中有效的虚拟内存。

由此可见,堆获得的空间比较灵活,也比较大。4.申请效率的比较: 栈由系统自动分配,速度较快。但程序员是无法控制的。

堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.体会:使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。

使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

3. malloc申请内存过大

malloc的参数仅仅是需要分配的内存字节数;calloc的参数包括元素的数量和每个元素的字节数

4. malloc超出内存大小

分配大小为sizeof(struct Student)的内存空间,同时将内存地址指正转换成struct Student*类型,该用法一般是为结构体指针分配内存空间。

5. malloc能分配多大内存

a占用的内存字节=a所指向的内存区域大小+a指针的大小在数据结构定义中,定义了一个长度为6的字符串num[6],定义了一个int类型的数组s,定义了一个double类型的ave。那么a所指向的内存区域大小=字符串num的大小+数组s的大小+双浮点ave的大小在C语言中,字符串在定义时就预分配空间(初始化为0),大小是字符串长度,也就是num实际大小为6。数组本质上是一个指针,在未对其中元素进行赋值或malloc分配内存时,其占用内存=指针的内存大小,所以s的大小为指针大小。双精度浮点数ave大小在定义时就已经确定。所以:a占用的内存字节=( 6 +指针字节数+双精度浮点字节数) + (指针字节数)在32位机器下,指针占用4个字节,双精度浮点数占用8个字节在64位机器下,指针占用8个字节,双精度浮点数占用8个字节最终的结果为:32位机器下,a的内存大小为 6 + 4 + 8 + 4 = 2264位机器下,a的内存大小为 6 + 8 + 8 + 8 = 30

6. malloc申请内存,同步分配物理内存

共享内存是进程间通信中最简单的方式之一。

共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。

当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。

7. malloc最大分配内存

malloc本身就是库函数 包含在malloc.h这个头文件中 不过 由于malloc.h被更常用的stdlib.h包含。 所以平时更多用 #include 形式为 void * malloc(size_t size); 功能为分配内存。

8. malloc 释放内存

malloc只是动态分配内存存储空间。void *malloc(long nBytes):该函数分配了nBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)例如:char *Ptr = NULL; Ptr = (char *)malloc(100 * sizeof(char)); 就是这样!当然,具体情况要具体分析以及具体解决

比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部