当前位置:首页 > 内存 > 正文

怎样动态申请和释放一段内存

  • 内存
  • 2024-08-21 03:38:32
  • 1283

一、C语言-动态分配内存malloc&free

需要一个数组来存储用户输入,但是我们不知道用户会输入多少条数据。

(1)数组设置太大,会浪费内存
(2)设置太小,不够用

问题:如何做到既足够又不浪费?

系统中有一个内存管理器(MM,MemoryManager),它负责管理一组空闲内存。它就是为了解决此类问题而设计的。

MM提供的服务:应用程序可以向MM请求(借用)一定大小的内存,使用完后释放(归还)。

当应用程序使用malloc时,它必须将返回值转换为目标类型。

这个内存和数组没有本质区别,用法是一样的。

你需要先计算一下需要多少字节的内存空间

数组示例:

释放的时候需要注意,因为for循环之后执行完毕,p地址向前移动了10,所以需要减去10再释放p,否则会有问题

//销毁时只需释放一次即可。malloc一些字节后,就会释放一些字节,无论char类型还是int类型
free(p);

在一个函数中动态分配的内存,这个内存在另一个函数中处理。function

(1)MM是系统级的东西,所有应用程序都向同一个MM请求内存。

(2)什么是贷款?事实上,当内存被借出时,MM只是标记了它管理的内存,表明该内存被占用了。比如它记录了每个占用的内存段(首地址、长度)
(p0,n0)(p1,n1)(p2,n2)...

(3)MM很大方:①只要有人借,它就同意借;②如果你不归还,它不会免费向你索要。

(4)MM管理的内存区域称为Heap“堆”

这意味着用户程序应该及时感到空闲,以免耽误其他使用。应用。如果有一个应用程序不断进行malloc但不释放,它最终会耗尽MM内存。当MM没有更多的空闲内存时,malloc返回NULL,表明内存已被使用。

再次强调:malloc后,申请应尽快释放!

使用原则:需要时重新申请,不需要时立即释放

实际开启,MM标识借用的内存块
(p0,n0)(p1,n1)(p2,n2)...
它内部保证了任意两个内存块不会“重叠”,即就是,不存在重叠,一块内存不会同时借给两个应用程序

对象引用的一块内存

示例:用Citizen代表公民,用Car代表汽车。开始,但将来可能有车

什么算“准时”?如果“不准时”会发生什么?

MM中的可用内存是有限,需要尽快归还,因为其他应用程序也需要MM内存。

只借不返回,积累到一定程度后,MM已经没有内存了,所以malloc返回NULL。

如果要还款,需要全额还款,否则MM无法处理

原因:MM可能没有可用内存眼下。(虽然一般情况不是这样)

free后,内存返回给MM,内存不再可用(无效)

不需要在同一个函数中发布,发布在应用程序的任何角落都有效。

也就是说:这块内存合并后,完全由你支配

功能:将s中当前位置后面的n个字节(typedefunsignedintsize_t)替换为ch。并返回s

参数:

参数:

功能:从src指向的内存区域复制n个字节到dest指向的内存区域。

memmove()函数与memcpy()相同。不同的是:当dest
和src指向的内存空间重叠时,memmove()仍然可以处理,但其执行效率比memcpy()低


二、如何动态分配内存1.从静态存储区分配。内存是在程序编译时分配的,并且该内存在程序的整个运行时都存在。例如全局变量、静态变量;
2.当执行函数时,可以在堆栈上创建函数中局部变量的存储单元,并且这些存储单元在函数退出时自动释放。堆栈内存分配操作内置于处理器的指令集中;
3从堆中分配,也称为动态内存分配。当程序运行时,可以使用malloc或ny来请求任意数量的内存。程序员负责决定何时使用free或delete来释放内存。