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

内存的申请和释放(怎样释放手机内存空间)

  • 内存
  • 2024-08-16 07:45:14
  • 6421

一、编程经验谈:如何正确使用内存​首先我们需要了解内存是如何分配的。一般来说,内存分配有以下三种方式:1.从静态内存区域分配。编译程序时,会分配内存,该内存在程序的整个运行时都存在。例如,全局变量和静态变量。
2.在堆栈上创建。当函数执行时,可以在堆栈上为函数内的局部变量创建存储单元,当函数完成时这些存储单元会自动释放。堆栈内存分配操作内置于处理器的指令集中,非常高效,但分配的内存容量有限。
3.从堆中分配,也称为动态内存分配。当程序运行时,可以使用malloc或new请求任意数量的内存。程序员负责何时使用free或delete来释放内存。动态内存的寿命是由我们决定的,它的使用非常灵活,但它也存在最多的问题。
在以上三种分配方式中,需要注意内存生存期的问题:1、静态分配区域的生存期是软件的整个运行时间,即从软件开始运行执行到软件终止。直到软件退出后,系统才会恢复该内存。2.堆栈上分配的空间的寿命取决于该变量所在的函数和类。如果是函数中定义的局部变量,那么它的生命周期就是函数被调用的时间。当函数结束时,该内存被回收。如果是类中的成员变量,则其生命周期与类实例3相同。堆上分配的内存的生命周期以调用new或malloc开始,以调用delete或free结束。如果没有,请使用删除或免费。那么这个空间就不能被系统回收,直到软件完全执行完毕。
内存错误是非常有问题的。编译器无法自动检测这些错误,通常会在程序运行时捕获它们。这些错误大多数没有明显的症状,时隐时现,导致纠正起来很困难。有时用户生气地来找你,但程序没有问题。如果您离开它,该错误将再次出现。
常见内存错误及对策如下:1、内存分配不成功但被使用。
新手程序员经常犯这个错误,因为他们没有意识到内存分配会失败。常见的解决方案是在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,则使用Assert(p!=NULL)检查函数的条目。使用malloc或new申请内存时,应该使用if(p==NULL)或if(p!=NULL)以避免错误。
​2虽然内存分配成功,但是在初始化之前会被引用。
出现这个错误的原因主要有两个:一是没有初始化的概念。另一方面,它错误地假设内存的默认初始值完全为零,这会导致引用初始值(例如数组)时出错。
​3内存分配成功并初始化,但操作超出内存限制。
例如,在使用数组时,经常会出现下标操作“大于1”或“小于1”。尤其是for循环语句,很容易得到错误的循环次数,导致数组运算越界。
4忘记释放内存,导致内存泄漏。
包含此错误的函数每次调用时都会丢失一块内存。最初,系统有足够的内存并且没有显示错误。最后,程序突然死掉,系统显示“内存耗尽”的信息。
应用程序和动态内存共享必须配对。程序中malloc和free的使用次数必须相同,否则肯定会出错(new/delete也是如此)。
5释放内存但继续使用它。
分三种情况:(1)程序中的对象调用关系过于复杂,要查出某个对象是否释放了内存确实很困难。这时候就应该从根本上重新设计数据结构,解决对象管理的混乱。

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

需要一个表来记录用户输入,但我们不知道用户会输入多少数据。

(1)如果定义的数组太大,会浪费内存。
(2)如果定义太小,又不够用。

问:怎么办?够用了,但一点也不浪费?

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

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

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

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

首先需要计算所需内存空间的字节数

示例表:

释放时需要小心,因为在for之后循环执行完毕,p地址前进了10,所以需要先减10再释放p,否则会有问题

//销毁时,不需要只释放一次。误分配几个字节后,你会释放其中的一些,无论char类型还是int类型
free(p);

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

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

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

(3)MM很慷慨:①只要有人分配,就同意借出。②如果你不归还,他们绝不会无偿向你要。

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

这意味着用户程序必须及时感到空闲,才能不耽误其他的使用应用程序。如果有一个应用程序不断进行内存分配而不是释放自身,它最终会耗尽MM中的内存。当MM用完空闲内存时,malloc返回NULL,表明内存已耗尽。

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

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

实际上,MM识别借出的内存块
(p0,n0)(p1,n1)(p2,n2)...
内部保证了两个内存块不会重叠””,即不会出现重叠,一块内存不会同时借给两个应用程序。

所以每个内存块在释放时的首地址是不同的,只需要指定首地址

对象引用的一块内存

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

那这算“及时”吗?

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

只借不还。经过一些积累,MM没有更多可用内存,因此malloc返回NULL。

如果要退款,必须全额退款,否则MM无法处理。

原因是:MM可能没有空闲内存。此时可用。(虽然这种情况一般不会出现)

一旦释放,内存返回给MM,该内存就不再可用了(无效)

也不是不需要释放在同一功能中,该版本在应用程序的任何角落都有效。

也就是说:一旦这块内存被错误分配,它就完全由你支配

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

参数:

参数:

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

memmove()函数与memcpy()相同。区别在于:当dest
和src指向的内存空间重叠时,memmove()仍然可以处理,但执行效率比较低的memcpy()要高


三、Linux内核中如何申请和释放内存?

1.首先打开Linux命令窗口,可以使用键盘快捷键Ctrl+Alt+T打开。

2、现在查看当前Linux系统内存使用情况,使用命令:Free-m,总内存,已用内存,free空闲内存。

3、接下来的操作,首先需要高级用户权限,输入命令:sudo-i,确认后输入高级用户密码。

4.现在复制文件以增加内存使用量(即已使用的使用量)。输入命令:cp-r/etc~/