为您找到与FREE的用法相关的共200个结果:
free有自由的;免费的;畅通的;没有…的;未使用的;空闲的等意思,那么你知道free的用法吗?下面跟着读文网小编一起来学习一下,希望对大家的学习有所帮助!
1. I wasn't expecting you to do it for free.
我并没有指望你白干。
2. You get a big salary incentive and free board and lodging too.
你们能获得大笔激励性薪水,还可享受免费膳宿。
3. The shark was writhing around wildly, trying to get free.
鲨鱼拼命挣扎,试图逃脱。
4. What I did for you was free, gratis, you understand?
我为你所做的一切都是免费的,无偿的,你明白吗?
5. They broke free and made off in a stolen car.
他们挣脱后开着一辆偷来的车逃之夭夭。
6. Some cases of arthritis respond to a gluten-free diet.
无麸质饮食对一些关节炎患者有疗效。
7. Jamaica's socialist government is adopting US-inspired free market practices.
牙买加的社会主义政府正在仿效美国实行自由市场。
8. Free room and board are provided for all hotel staff.
宾馆的所有员工都可享受免费膳宿。
9. The service covers contraceptive advice and health checks, and is availablefree.
服务项目包括避孕建议和健康检查,并且免费提供。
10. Britain is free to adopt policies to bolster its economy.
英国可以自由制定政策以振兴经济。
11. Would Bethany return of her own free will, as she had promised?
贝萨妮会像她承诺的那样自愿回来吗?
12. Firemen tried to free the injured and put out the blaze.
消防队员努力救出伤者并扑灭大火。
13. I could see the young boy struggling to free himself.
我看到小男孩正在奋力挣脱。
14. She retains her slim figure and is free of wrinkles.
她保持着苗条的身材,脸上也没有皱纹。
15. We'll put together a proposal, including detailed costings, free of charge.
我们将免费拟一份提案,其中包括详细的成本估算。
浏览量:2
下载量:0
时间:
freeze有冻结;冷冻;僵硬;凝固等意思,那么你知道freeze的过去式是什么吗?下面跟着读文网小编一起来学习一下,希望对大家的学习有所帮助!
1. What if it rained and then froze all through those months?
要是那几个月一直又下雨又冰冻怎么办?
2. He could hear a sudden roaring. His blood froze.
他听到突如其来的一声吼叫,吓得魂不附体。
3. She froze when the beam of the flashlight struck her.
当手电筒的光照到她身上时她僵住了。
4. The ground froze solid.
地面冻实了。
5. He either suffocated, or froze to death.
他要么是闷死的,要么是冻死的。
6. She froze, her mouth hanging open.
她呆住了,嘴张开着。
7. The girls froze him off when he wanted to join the party.
当他想参加舞会时,姑娘们拒绝了他.
8. The club members froze onto his suggestion for reorganizing the money.
俱乐部成员赞成他关于重新安排款项的提议.
9. She froze up and refused to say a word.
她变得非常冷淡,一言不发.
10. Half the fruit crop froze out in the sudden severe autumn.
有一半水果作物在秋天突如其来的严寒中冻死了.
11. We froze off their offer of help.
我们拒绝接受他们提出的帮助.
12. Two of them froze to death.
他们当中有两人冻死了.
13. Ellen froze with terror at the frightful sight.
埃伦被这种恐怖场面吓得发抖.
14. The water in the bowl froze last night.
昨夜碗里的水冻冰了.
15. The piston froze in the cylinder.
活塞冻牢在汽缸里.
浏览量:2
下载量:0
时间:
在C语言的学习中,对内存管理这部分的知识掌握尤其重要!现在我们来看看c语言free的用法。
一、malloc()和free()的基本概念以及基本用法:
1、函数原型及说明:
void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。
关于分配失败的原因,应该有多种,比如说空间不足就是一种。
void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。
2、函数的用法:
其实这两个函数用起来倒不是很难,也就是malloc()之后觉得用够了就甩了它把它给free()了,举个简单例子:
https:// Code...
char *Ptr = NULL;
Ptr = (char *)malloc(100 * sizeof(char));
if (NULL == Ptr)
{
exit (1);
}
gets(Ptr);
https:// code...
free(Ptr);
Ptr = NULL;
https:// code...
就是这样!当然,具体情况要具体分析以及具体解决。比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了。
3、关于函数使用需要注意的一些地方:
A、申请了内存空间后,必须检查是否分配成功。
B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。
C、这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会
出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。
D、虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一
些编译器的检查。
好了!最基础的东西大概这么说!现在进入第二部分:
二、malloc()到底从哪里得来了内存空间:
1、malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。就是这样!
说到这里,不得不另外插入一个小话题,相信大家也知道是什么话题了。什么是堆?说到堆,又忍不住说到了栈!什么是栈?下面就另外开个小部分专门而又简单地说一下这个题外话:
2、什么是堆:堆是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程 初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。
什么是栈:栈是线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立。每个函数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈,就是切换SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。
以上的概念描述是标准的描述,不过有个别语句被我删除,不知道因为这样而变得不标准了^_^.
通过上面对概念的描述,可以知道:
栈是由编译器自动分配释放,存放函数的参数值、局部变量的值等。操作方式类似于数据结构中的栈。
堆一般由程序员分配释放,若不释放,程序结束时可能由OS回收。注意这里说是可能,并非一定。所以我想再强调一次,记得要释放!
注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。(这点我上面稍微提过)
所以,举个例子,如果你在函数上面定义了一个指针变量,然后在这个函数里申请了一块内存让指针指向它。实际上,这个指针的地址是在栈上,但是它所指向的内容却是在堆上面的!这一点要注意!所以,再想想,在一个函数里申请了空间后,比如说下面这个函数:
https:// code...
void Function(void)
{
char *p = (char *)malloc(100 * sizeof(char));
}
就这个例子,千万不要认为函数返回,函数所在的栈被销毁指针也跟着销毁,申请的内存也就一样跟着销毁了!这绝对是错误的!因为申请的内存在堆上,而函数所在的栈被销毁跟堆完全没有啥关系。所以,还是那句话:记得释放!
3、free()到底释放了什么
这个问题比较简单,其实我是想和第二大部分的题目相呼应而已!哈哈!free()释放的是指针指向的内存!注意!释放的是内存,不是指针!这点非常非常重要!指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,所以说是垃圾。因此,前面我已经说过了,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了。非常重要啊这一点!
好了!这个“题外话”终于说完了。就这么简单说一次,知道个大概就可以了!下面就进入第三个部分:
三、malloc()以及free()的机制:
这个部分我今天才有了新的认识!而且是转折性的认识!所以,这部分可能会有更多一些认识上的错误!不对的地方请大家帮忙指出!
事实上,仔细看一下free()的函数原型,也许也会发现似乎很神奇,free()函数非常简单,只有一个参数,只要把指向申请空间的指针传递
给free()中的参数就可以完成释放工作!这里要追踪到malloc()的申请问题了。申请的时候实际上占用的内存要比申请的大。因为超出的空间是用来记录对这块内存的管理信息。先看一下在《UNIX环境高级编程》中第七章的一段话:
大多数实现所分配的存储空间比所要求的要稍大一些,额外的空间用来记录管理信息——分配块的长度,指向下一个分配块的指针等等。这就意味着如果写过一个已分配区的尾端,则会改写后一块的管理信息。这种类型的错误是灾难性的,但是因为这种错误不会很快就暴露出来,所以也就很难发现。将指向分配块的指针向后移动也可能会改写本块的管理信息。
以上这段话已经给了我们一些信息了。malloc()申请的空间实际我觉得就是分了两个不同性质的空间。一个就是用来记录管理信息的空间,另外一个就是可用空间了。而用来记录管理信息的实际上是一个结构体。在C语言中,用结构体来记录同一个对象的不同信息是
天经地义的事!下面看看这个结构体的原型:
struct mem_control_block {
int is_available; https://这是一个标记?
int size; https://这是实际空间的大小
};
对于size,这个是实际空间大小。这里其实我有个疑问,is_available是否是一个标记?因为我看了free()的源代码之后对这个变量感觉有点纳闷(源代码在下面分析)。这里还请大家指出!
所以,free()就是根据这个结构体的信息来释放malloc()申请的空间!而结构体的两个成员的大小我想应该是操作系统的事了。但是这里有一个问题,malloc()申请空间后返回一个指针应该是指向第二种空间,也就是可用空间!不然,如果指向管理信息空间的话,写入的内容和结构体的类型有可能不一致,或者会把管理信息屏蔽掉,那就没法释放内存空间了,所以会发生错误!(感觉自己这里说的是废话)
好了!下面看看free()的源代码,我自己分析了一下,觉得比起malloc()的源代码倒是容易简单很多。只是有个疑问,下面指出!
https:// code...
void free(void *ptr)
{
struct mem_control_block *free;
free = ptr - sizeof(struct mem_control_block);
free->is_available = 1;
return;
}
看一下函数第二句,这句非常重要和关键。其实这句就是把指向可用空间的指针倒回去,让它指向管理信息的那块空间,因为这里是在值上减去了一个结构体的大小!后面那一句free->is_available = 1;我有点纳闷!我的想法是:这里is_available应该只是一个标记而已!因为从这个变量的名称上来看,is_available 翻译过来就是“是可以用”。不要说我土!我觉得变量名字可以反映一个变量的作用,特别是严谨的代码。这是源代码,所以我觉得绝对是严谨的!!这个变量的值是1,表明是可以用的空间!只是这里我想了想,如果把它改为0或者是其他值不知道会发生什么事?!但是有一点我可以肯定,就是释放绝对不会那么顺利进行!因为这是一个标记!
当然,这里可能还是有人会有疑问,为什么这样就可以释放呢??我刚才也有这个疑问。后来我想到,释放是操作系统的事,那么就free()这个源代码来看,什么也没有释放,对吧?但是它确实是确定了管理信息的那块内存的内容。所以,free()只是记录了一些信息,然后告诉操作系统那块内存可以去释放,具体怎么告诉操作系统的我不清楚,但我觉得这个已经超出了我这篇文章的讨论范围了。
那么,我之前有个错误的认识,就是认为指向那块内存的指针不管移到那块内存中的哪个位置都可以释放那块内存!但是,这是大错特错!释放是不可以释放一部分的!首先这点应该要明白。而且,从free()的源代码看,ptr只能指向可用空间的首地址,不然,减去结构体大小之后一定不是指向管理信息空间的首地址。所以,要确保指针指向可用空间的首地址!不信吗?自己可以写一个程序然后移动指向可用空间的指针,看程序会有会崩!
最后可能想到malloc()的源代码看看malloc()到底是怎么分配空间的,这里面涉及到很多其他方面的知识!有兴趣的朋友可以自己去下载源
代码去看看。
浏览量:2
下载量:0
时间:
free()与malloc()函数配对使用,释放malloc函数申请的动态内存。下面读文网小编就跟你们详细介绍下c语言中free的用法,希望对你们有用。
这个部分我今天才有了新的认识!而且是转折性的认识!所以,这部分可能会有更多一些认识上的错误!不对的地方请大家帮忙指出!
事实上,仔细看一下free()的函数原型,也许也会发现似乎很神奇,free()函数非常简单,只有一个参数,只要把指向申请空间的指针传递
给free()中的参数就可以完成释放工作!这里要追踪到malloc()的申请问题了。申请的时候实际上占用的内存要比申请的大。因为超出的空间是用来记录对这块内存的管理信息。先看一下在《UNIX环境高级编程》中第七章的一段话:
大多数实现所分配的存储空间比所要求的要稍大一些,额外的空间用来记录管理信息——分配块的长度,指向下一个分配块的指针等等。这就意味着如果写过一个已分配区的尾端,则会改写后一块的管理信息。这种类型的错误是灾难性的,但是因为这种错误不会很快就暴露出来,所以也就很难发现。将指向分配块的指针向后移动也可能会改写本块的管理信息。
以上这段话已经给了我们一些信息了。malloc()申请的空间实际我觉得就是分了两个不同性质的空间。一个就是用来记录管理信息的空间,另外一个就是可用空间了。而用来记录管理信息的实际上是一个结构体。在C语言中,用结构体来记录同一个对象的不同信息是
天经地义的事!下面看看这个结构体的原型:
程序代码:
struct mem_control_block {
int is_available; //这是一个标记?
int size; //这是实际空间的大小
};
对于size,这个是实际空间大小。这里其实我有个疑问,is_available是否是一个标记?因为我看了free()的源代码之后对这个变量感觉有点纳闷(源代码在下面分析)。这里还请大家指出!
所以,free()就是根据这个结构体的信息来释放malloc()申请的空间!而结构体的两个成员的大小我想应该是操作系统的事了。但是这里有一个问题,malloc()申请空间后返回一个指针应该是指向第二种空间,也就是可用空间!不然,如果指向管理信息空间的话,写入的内容和结构体的类型有可能不一致,或者会把管理信息屏蔽掉,那就没法释放内存空间了,所以会发生错误!(感觉自己这里说的是废话)
好了!下面看看free()的源代码,我自己分析了一下,觉得比起malloc()的源代码倒是容易简单很多。只是有个疑问,下面指出!
程序代码:
看一下函数第二句,这句非常重要和关键。其实这句就是把指向可用空间的指针倒回去,让它指向管理信息的那块空间,因为这里是在值上减去了一个结构体的大小!后面那一句free->is_available =1;我有点纳闷!我的想法是:这里is_available应该只是一个标记而已!因为从这个变量的名称上来看,is_available翻译过来就是“是可以用”。不要说我土!我觉得变量名字可以反映一个变量的作用,特别是严谨的代码。这是源代码,所以我觉得绝对是严谨的!!这个变量的值是1,表明是可以用的空间!只是这里我想了想,如果把它改为0或者是其他值不知道会发生什么事?!但是有一点我可以肯定,就是释放绝对不会那么顺利进行!因为这是一个标记!
当然,这里可能还是有人会有疑问,为什么这样就可以释放呢??我刚才也有这个疑问。后来我想到,释放是操作系统的事,那么就free()这个源代码来看,什么也没有释放,对吧?但是它确实是确定了管理信息的那块内存的内容。所以,free()只是记录了一些信息,然后告诉操作系统那块内存可以去释放,具体怎么告诉操作系统的我不清楚,但我觉得这个已经超出了我这篇文章的讨论范围了。
那么,我之前有个错误的认识,就是认为指向那块内存的指针不管移到那块内存中的哪个位置都可以释放那块内存!但是,这是大错特错!释放是不可以释放一部分的!首先这点应该要明白。而且,从free()的源代码看,ptr只能指向可用空间的首地址,不然,减去结构体大小之后一定不是指向管理信息空间的首地址。所以,要确保指针指向可用空间的首地址!不信吗?自己可以写一个程序然后移动指向可用空间的指针,看程序会有会崩!
最后可能想到malloc()的源代码看看malloc()到底是怎么分配空间的,这里面涉及到很多其他方面的知识!有兴趣的朋友可以自己去下载源
代码去看看。
=================================================
C语言的malloc分配的的内存大小
没读过malloc()的源码,所以这里纯粹是"理论研究"。
malloc()在运行期动态分配分配内存,free()释放由其分配的内存。malloc()在分配用户传入的大小的时候,还分配的一个相关的用于管理的额外内存,不过,用户是看不到的。所以,
实际的大小 = 管理空间 + 用户空间
那么,这个管理内存放在什么位置呢,它要让free()函数能够找到,这样才能知道有多少内存要释放,所以一种可能的方案是在分配内存的初始部分用若干个字节来存储分配的内存的大小。这里要注意一个问题,就是,在malloc()将这个分配的空间返回给某个指针后,这个指针的使用与其它指针应该是没有差别的,所以,管理空间应该在这个指针指向的空间之外,但又要free()从这个指针可以找到管理信息,所以,这个管理空间的大小放在指针指向的相反方向。故malloc()的具体操作应该就是分配一块内存,在前面若干字节中写入管理信息,然后返回管理信息所占字节之后的地址指针。
=================================================
malloc()工作机制
malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。
malloc()在操作系统中的实现
在 C 程序中,多次使用malloc () 和 free()。不过,您可能没有用一些时间去思考它们在您的操作系统中是如何实现的。本节将向您展示 malloc 和 free 的一个最简化实现的代码,来帮助说明管理内存时都涉及到了哪些事情。
在大部分操作系统中,内存分配由以下两个简单的函数来处理:
void *malloc (long numbytes):该函数负责分配 numbytes 大小的内存,并返回指向第一个字节的指针。
void free(void *firstbyte):如果给定一个由先前的 malloc 返回的指针,那么该函数会将分配的空间归还给进程的“空闲空间”。
malloc_init 将是初始化内存分配程序的函数。它要完成以下三件事:将分配程序标识为已经初始化,找到系统中最后一个有效内存地址,然后建立起指向我们管理的内存的指针。这三个变量都是全局变量:
//清单 1. 我们的简单分配程序的全局变量
如前所述,被映射的内存的边界(最后一个有效地址)常被称为系统中断点或者 当前中断点。在很多 UNIX?系统中,为了指出当前系统中断点,必须使用 sbrk(0) 函数。 sbrk根据参数中给出的字节数移动当前系统中断点,然后返回新的系统中断点。使用参数 0 只是返回当前中断点。这里是我们的 malloc初始化代码,它将找到当前中断点并初始化我们的变量:
清单 2. 分配程序初始化函数
现在,为了完全地管理内存,我们需要能够追踪要分配和回收哪些内存。在对内存块进行了 free调用之后,我们需要做的是诸如将它们标记为未被使用的等事情,并且,在调用 malloc 时,我们要能够定位未被使用的内存块。因此, malloc返回的每块内存的起始处首先要有这个结构:
//清单 3. 内存控制块结构定义
现在,您可能会认为当程序调用 malloc 时这会引发问题 ——它们如何知道这个结构?答案是它们不必知道;在返回指针之前,我们会将其移动到这个结构之后,把它隐藏起来。这使得返回的指针指向没有用于任何其他用途的内存。那样,从调用程序的角度来看,它们所得到的全部是空闲的、开放的内存。然后,当通过 free()将该指针传递回来时,我们只需要倒退几个内存字节就可以再次找到这个结构。
在讨论分配内存之前,我们将先讨论释放,因为它更简单。为了释放内存,我们必须要做的惟一一件事情就是,获得我们给出的指针,回退 sizeof(struct mem_control_block) 个字节,并将其标记为可用的。这里是对应的代码:
清单 4. 解除分配函数
这就是我们的内存管理器。现在,我们只需要构建它,并在程序中使用它即可.多次调用malloc()后空闲内存被切成很多的小内存片段,这就使得用户在申请内存使用时,由于找不到足够大的内存空间,malloc()需要进行内存整理,使得函数的性能越来越低。聪明的程序员通过总是分配大小为2的幂的内存块,而最大限度地降低潜在的malloc性能丧失。也就是说,所分配的内存块大小为4字节、8字节、16字节、18446744073709551616字节,等等。这样做最大限度地减少了进入空闲链的怪异片段(各种尺寸的小片段都有)的数量。尽管看起来这好像浪费了空间,但也容易看出浪费的空间永远不会超过50%
浏览量:2
下载量:0
时间:
下面小编就跟你们详细介绍下c中free的用法的用法,希望对你们有用。
在C语言的学习中,对内存管理这部分的知识掌握尤其重要!之前对C中的malloc()和free()两个函数的了解甚少,只知道大概该怎么用——就是malloc然后free就一切OK了。当然现在对这两个函数的体会也不见得多,不过对于本文章第三部分的内容倒是有了转折性的认识,所以
写下这篇文章作为一个对知识的总结。这篇文章之所以命名中有个“浅谈”的字眼,也就是这个意思了!希望对大家有一点帮助!
如果不扯得太远的话(比如说操作系统中虚拟内存和物理内存如何运做如何管理之类的知识等),我感觉这篇文章应该是比较全面地谈了一下malloc()和free().这篇文章由浅入深(不见得有多深)分三个部分介绍主要内容。
废话了那么多,下面立刻进入主题================》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
一、malloc()和free()的基本概念以及基本用法:
1、函数原型及说明:
void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。
关于分配失败的原因,应该有多种,比如说空间不足就是一种。
void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。
2、函数的用法:
其实这两个函数用起来倒不是很难,也就是malloc()之后觉得用够了就甩了它把它给free()了,举个简单例子:
https:// Code...
char *Ptr = NULL;
Ptr = (char *)malloc(100 * sizeof(char));
if (NULL == Ptr)
{
exit (1);
}
gets(Ptr);
https:// code...
free(Ptr);
Ptr = NULL;
https:// code...
就是这样!当然,具体情况要具体分析以及具体解决。比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了。
3、关于函数使用需要注意的一些地方:
A、申请了内存空间后,必须检查是否分配成功。
B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。
C、这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会
出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。
D、虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一
些编译器的检查。
好了!最基础的东西大概这么说!现在进入第二部分:
二、malloc()到底从哪里得来了内存空间:
1、malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。就是这样!
说到这里,不得不另外插入一个小话题,相信大家也知道是什么话题了。什么是堆?说到堆,又忍不住说到了栈!什么是栈?下面就另外开个小部分专门而又简单地说一下这个题外话:
2、什么是堆:堆是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程 初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。
什么是栈:栈是线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立。每个函数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈,就是切换SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。
以上的概念描述是标准的描述,不过有个别语句被我删除,不知道因为这样而变得不标准了^_^.
通过上面对概念的描述,可以知道:
栈是由编译器自动分配释放,存放函数的参数值、局部变量的值等。操作方式类似于数据结构中的栈。
堆一般由程序员分配释放,若不释放,程序结束时可能由OS回收。注意这里说是可能,并非一定。所以我想再强调一次,记得要释放!
注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。(这点我上面稍微提过)
所以,举个例子,如果你在函数上面定义了一个指针变量,然后在这个函数里申请了一块内存让指针指向它。实际上,这个指针的地址是在栈上,但是它所指向的内容却是在堆上面的!这一点要注意!所以,再想想,在一个函数里申请了空间后,比如说下面这个函数:
https:// code...
void Function(void)
{
char *p = (char *)malloc(100 * sizeof(char));
}
就这个例子,千万不要认为函数返回,函数所在的栈被销毁指针也跟着销毁,申请的内存也就一样跟着销毁了!这绝对是错误的!因为申请的内存在堆上,而函数所在的栈被销毁跟堆完全没有啥关系。所以,还是那句话:记得释放!
3、free()到底释放了什么
这个问题比较简单,其实我是想和第二大部分的题目相呼应而已!哈哈!free()释放的是指针指向的内存!注意!释放的是内存,不是指针!这点非常非常重要!指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,所以说是垃圾。因此,前面我已经说过了,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了。非常重要啊这一点!
好了!这个“题外话”终于说完了。就这么简单说一次,知道个大概就可以了!下面就进入第三个部分:
三、malloc()以及free()的机制:
这个部分我今天才有了新的认识!而且是转折性的认识!所以,这部分可能会有更多一些认识上的错误!不对的地方请大家帮忙指出!
事实上,仔细看一下free()的函数原型,也许也会发现似乎很神奇,free()函数非常简单,只有一个参数,只要把指向申请空间的指针传递
给free()中的参数就可以完成释放工作!这里要追踪到malloc()的申请问题了。申请的时候实际上占用的内存要比申请的大。因为超出的空间是用来记录对这块内存的管理信息。先看一下在《UNIX环境高级编程》中第七章的一段话:
大多数实现所分配的存储空间比所要求的要稍大一些,额外的空间用来记录管理信息——分配块的长度,指向下一个分配块的指针等等。这就意味着如果写过一个已分配区的尾端,则会改写后一块的管理信息。这种类型的错误是灾难性的,但是因为这种错误不会很快就暴露出来,所以也就很难发现。将指向分配块的指针向后移动也可能会改写本块的管理信息。
以上这段话已经给了我们一些信息了。malloc()申请的空间实际我觉得就是分了两个不同性质的空间。一个就是用来记录管理信息的空间,另外一个就是可用空间了。而用来记录管理信息的实际上是一个结构体。在C语言中,用结构体来记录同一个对象的不同信息是
天经地义的事!下面看看这个结构体的原型:
struct mem_control_block {
int is_available; https://这是一个标记?
int size; https://这是实际空间的大小
};
对于size,这个是实际空间大小。这里其实我有个疑问,is_available是否是一个标记?因为我看了free()的源代码之后对这个变量感觉有点纳闷(源代码在下面分析)。这里还请大家指出!
所以,free()就是根据这个结构体的信息来释放malloc()申请的空间!而结构体的两个成员的大小我想应该是操作系统的事了。但是这里有一个问题,malloc()申请空间后返回一个指针应该是指向第二种空间,也就是可用空间!不然,如果指向管理信息空间的话,写入的内容和结构体的类型有可能不一致,或者会把管理信息屏蔽掉,那就没法释放内存空间了,所以会发生错误!(感觉自己这里说的是废话)
好了!下面看看free()的源代码,我自己分析了一下,觉得比起malloc()的源代码倒是容易简单很多。只是有个疑问,下面指出!
https:// code...
void free(void *ptr)
{
struct mem_control_block *free;
free = ptr - sizeof(struct mem_control_block);
free->is_available = 1;
return;
}
看一下函数第二句,这句非常重要和关键。其实这句就是把指向可用空间的指针倒回去,让它指向管理信息的那块空间,因为这里是在值上减去了一个结构体的大小!后面那一句free->is_available = 1;我有点纳闷!我的想法是:这里is_available应该只是一个标记而已!因为从这个变量的名称上来看,is_available 翻译过来就是“是可以用”。不要说我土!我觉得变量名字可以反映一个变量的作用,特别是严谨的代码。这是源代码,所以我觉得绝对是严谨的!!这个变量的值是1,表明是可以用的空间!只是这里我想了想,如果把它改为0或者是其他值不知道会发生什么事?!但是有一点我可以肯定,就是释放绝对不会那么顺利进行!因为这是一个标记!
当然,这里可能还是有人会有疑问,为什么这样就可以释放呢??我刚才也有这个疑问。后来我想到,释放是操作系统的事,那么就free()这个源代码来看,什么也没有释放,对吧?但是它确实是确定了管理信息的那块内存的内容。所以,free()只是记录了一些信息,然后告诉操作系统那块内存可以去释放,具体怎么告诉操作系统的我不清楚,但我觉得这个已经超出了我这篇文章的讨论范围了。
那么,我之前有个错误的认识,就是认为指向那块内存的指针不管移到那块内存中的哪个位置都可以释放那块内存!但是,这是大错特错!释放是不可以释放一部分的!首先这点应该要明白。而且,从free()的源代码看,ptr只能指向可用空间的首地址,不然,减去结构体大小之后一定不是指向管理信息空间的首地址。所以,要确保指针指向可用空间的首地址!不信吗?自己可以写一个程序然后移动指向可用空间的指针,看程序会有会崩!
浏览量:2
下载量:0
时间:
freeze有冻结;冷冻;僵硬;凝固等意思,那么你知道freeze的用法吗?下面跟着读文网小编一起来学习一下,希望对大家的学习有所帮助!
1. A wage freeze was imposed on all staff earlier this month.
这个月早些时候,所有员工的工资都被冻结了。
2. Freeze it only until firm but not rock solid.
把它冻硬,但是不要硬得像石头一样。
3. The coffee is freeze-dried to seal in all the flavour.
咖啡经冷冻干燥以保留原汁原味。
4. The trees were damaged by a freeze in December.
那些树因为12月里的一次冰冻而遭到毁坏。
5. When the chicken is cooked I'll freeze some.
鸡肉做好以后,我会把一部分冷冻起来.
6. The water pipes will freeze.
水管会冻住。
7. Ice could freeze up their torpedo release mechanisms.
冰可能会冻死他们的鱼雷发射装置。
8. You can freeze the soup at this stage.
这时可以把汤冷冻起来。
9. Most fresh herbs will freeze successfully.
大多数新鲜的芳草都很适宜冷冻贮藏。
10. Your hands will freeze doing this.
做这个手会冻僵的。
11. They want the government to freeze prices.
他们希望政府冻结物价。
12. He slipped and broke his leg during the big freeze.
他在严寒期间滑倒,摔断了腿.
13. In capitalist society, big enterprises always try to freeze out the smaller ones.
在资本主义社会, 大企业总是千方百计地排挤小企业.
14. The children wanted the lake to freeze over so they could ice - skate.
孩子们希望湖面结冰,这样他们就可以在上面滑冰了.
15. They seemed to freeze me out of the family.
看样子他们想把我从这个家里赶走.
浏览量:4
下载量:0
时间:
free有自由的;免费的;畅通的等意思,那么你知道free的用法吗?下面跟着读文网小编一起来学习一下,希望对大家的学习有所帮助!
1. I wasn't expecting you to do it for free.
我并没有指望你白干。
2. You get a big salary incentive and free board and lodging too.
你们能获得大笔激励性薪水,还可享受免费膳宿。
3. The shark was writhing around wildly, trying to get free.
鲨鱼拼命挣扎,试图逃脱。
4. What I did for you was free, gratis, you understand?
我为你所做的一切都是免费的,无偿的,你明白吗?
5. They broke free and made off in a stolen car.
他们挣脱后开着一辆偷来的车逃之夭夭。
6. Some cases of arthritis respond to a gluten-free diet.
无麸质饮食对一些关节炎患者有疗效。
7. Jamaica's socialist government is adopting US-inspired free market practices.
牙买加的社会主义政府正在仿效美国实行自由市场。
8. Free room and board are provided for all hotel staff.
宾馆的所有员工都可享受免费膳宿。
9. The service covers contraceptive advice and health checks, and is availablefree.
服务项目包括避孕建议和健康检查,并且免费提供。
10. Britain is free to adopt policies to bolster its economy.
英国可以自由制定政策以振兴经济。
11. Would Bethany return of her own free will, as she had promised?
贝萨妮会像她承诺的那样自愿回来吗?
12. Firemen tried to free the injured and put out the blaze.
消防队员努力救出伤者并扑灭大火。
13. I could see the young boy struggling to free himself.
我看到小男孩正在奋力挣脱。
14. She retains her slim figure and is free of wrinkles.
她保持着苗条的身材,脸上也没有皱纹。
15. We'll put together a proposal, including detailed costings, free of charge.
我们将免费拟一份提案,其中包括详细的成本估算。
浏览量:3
下载量:0
时间:
free做动词有释放;使自由;使摆脱;解除等意思,那么你知道free的过去式是什么吗?下面是读文网小编整理的free的过去式和用法例句,欢迎大家学习!
free的用法1:free的基本意思是“释放,使自由〔解放〕”,指除去或松开抑制之物而给予自由或使某物不再受限制或阻碍,主要用于表示解放某人,某事物或释放奴隶、犯人,也可指使某人或某事从某种不愉快或受限制的状况、状态中摆脱出来,还可指清除障碍物或去除缠绕。其宾语可以是人、动物或国家等,可用于被动结构。
free的用法2:free偶尔也可接以动词不定式充当补足语的复合宾语。
free的用法3:free作“使免除”解时,可用free sb of〔from〕 sth 结构。
浏览量:3
下载量:0
时间:
annoy做动词有使恼怒;使烦恼;骚扰等意思,那么你知道annoy的过去式是什么吗?下面跟着读文网小编一起来学习一下,供大家参考学习!
1. Annoyed commuters could only watch as the departure time ticked by.
随着发车时间一点点过去,恼怒的上班族只能干瞪眼。
2. Eleanor was annoyed at having had to wait so long for him.
埃莉诺为不得不等他这么长时间而感到很恼火。
3. She tapped her forehead and looked annoyed with herself.
她拍打着脑门,看上去在生自己的气。
4. Costello later apologized, saying he'd been annoyed by the man.
科斯特洛后来表示了歉意,说他是被那人惹怒的。
5. He was beginning to get very annoyed with me about my carelessness.
因为我粗心大意,他已开始恼火了。
6. Anne was fond of Tim, though he often annoyed her.
安妮喜欢蒂姆,虽然他经常使她心烦。
7. He was annoyed to learn that the train would be delayed.
他听说火车要晚点,心里感到烦恼.
8. The affectations in the way she speaks annoyed me.
她说话时装腔作势的样子惹我恼火.
9. I was annoyed by hecklers during the last half of my speech.
我在作后半部分报告时,对质问者感到厌烦.
10. The babble of voices in the next compartment annoyed all of us.
隔壁的车厢隔间里不间歇的嘈杂谈话声让我们都很气恼.
11. He can hardly be other than annoyed about it.
他当然只会对此感到烦恼.
12. He was annoyed that we had one of his cushions.
我们用了他的一个坐垫,他很生气.
13. You were obviously annoyed that the child had happened along.
那孩子突然地出现你显然很生气.
14. I imagine she was pretty annoyed when she found out.
我想她发现此事后一定很生气.
15. He was annoyed with me for having said the wrong thing.
他嗔着我说错了话.
浏览量:3
下载量:0
时间:
apologize做动词有道歉;赔罪等意思,那么你知道answer的过去式是什么吗?下面跟着读文网小编一起来学习一下,希望对大家的学习有所帮助!
apologize的用法1:apologize的意思是因做事不周或不当而表示歉意。可指提出掩饰性的情况,以免见怪;也可指坦率承认错误,以作弥补。
apologize的用法2:apologize通常用作不及物动词,表示“向某人道歉”,接to sb; 表示“因某事道歉”,接for sth; 表示“因某事向某人道歉”,则接to sb for sth。
apologize的用法3:apologize也可接that从句,这时用作及物动词,意思是“道歉说…”。apologize还可引出直接引语。
浏览量:3
下载量:0
时间:
balance做动词有权衡;使平衡;抵消;称重量等意思,那么你知道balance的过去式是什么吗?下面跟着读文网小编一起来学习一下,欢迎大家学习!
1. It makes sense to eat a reasonably balanced diet when slimming.
在减肥过程中保持饮食的营养相对均衡是明智的。
2. I have to prove myself as a respectable, balanced, person.
我必须证明自己是个正派、稳重的人。
3. He balanced his budgets by rigid control over public expenditure.
他通过严格控制公共开支保持预算平衡。
4. He cut down on coffee and cigarettes, and ate a balanced diet.
他喝咖啡和吸烟都比以前少了,饮食也均衡了。
5. The forehand stroke should be fluid and well balanced.
正手击球应该保证动作流畅和平稳。
6. Engel is quoted as saying that balanced people do not become artists.
引用恩格尔的话说就是理性的人是成不了艺术家的。
7. It is essential that your diet is varied and balanced.
关键是你的饮食要多样化,并保持均衡。
8. His patriarchal generosity is counter-balanced by his ruthlessness.
他有着族长式的慷慨大方,同时却又冷漠无情。
9. Outgoings and revenues balanced out.
收支相抵。
10. This book is a well balanced biography.
此书是一部相当客观的传记。
11. I balanced on the ledge.
我在窗台上站稳。
12. The programme presented a balanced view of the two sides of the conflict.
节目公平地反映了冲突双方的情况。
13. to have a healthy, balanced diet
有健康和均衡的饮食
14. The team was not well balanced.
这个队的队员配备得不是很均衡。
15. There are highly sensitive and delicately balanced ecosystems in the forest.
森林里有高度敏感、灵敏平衡的各种生态系统.
浏览量:4
下载量:0
时间:
battle做动词有与 ... 作战;与 ... 竞争等意思,那么你知道battle的过去式是什么吗?下面跟着读文网小编一起来学习一下,欢迎大家学习!
battle的用法1:battle用作动词的基本意思是“作战”“斗争”,可指战场上真刀真枪地厮杀,也可指意识形态领域中的斗争,用于比喻,可指“努力”“奋斗”。它的主语一般是人、党派等,宾语可以是人,也可以是抽象名词,一般不接具体名词。
battle的用法2:battle可用作及物动词,接简单宾语; 也可用作不及物动词,接介词against/with表示“对象”(可以是人、物,也可以是抽象事物),接介词for表示“目的”。
浏览量:3
下载量:0
时间:
boycott做动词有抵制(贸易);拒绝参加等意思,那么你知道boycott的过去式是什么吗?下面跟着读文网小编一起来学习一下,欢迎大家学习!
1. When America boycotted the Moscow Olympics it cheapened the medals won.
美国抵制莫斯科奥运会的行为使金牌的含金量降低了。
2. The main opposition parties boycotted the election, saying it would not be conducted fairly.
主要反对党联合抵制这次选举,认为该选举将缺乏公正性。
3. Opposition parties have boycotted the proceedings, saying the government has packed the conference with its own supporters.
反对党派抵制了该议程,声称政府在大会上安插了亲信。
4. Athletes from several countries boycotted the Olympic Games.
有好几国的运动员抵制奥林匹克运动会.
5. The opposition party earlier boycotted the Diet agenda, demanding Miyaji's resignation.
反对党曾杯葛国会议程, 要宫路下台.
6. Therefore, reputable and qualified scientists in this field are boycotted a priori.
因此, 正是该领域中有信誉的称职的科学家在阻止一种经验.
7. The U.S. boycotted the Olympics in Moscow while he was president.
他任总统期间,美国抵制了莫斯科奥运会.
8. Should the Olympics in China be boycotted?
是否应该抵制中国举办奥运会?
9. One country has boycotted Winter Olympics.
曾有国家抵制冬季奥运会.
10. In protest, many colonists boycotted English products.
为了反抗, 许多殖民者抵制英国商品.
11. Boycotted as part of a labor union action.
作为工会行动的一部分而被工会抵制的.
12. They boycotted the meeting.
他们拒绝参加那个会议.
13. And they boycotted the buses.
而且他们联合抵制了公共汽车.
14. The AL screamed foul, boycotted the election and called its thugs onto the streets.
“人民联盟”大呼犯规, 抵制选举,把狂热的支持者召集到街上.
15. For more than two decades, the People's Republic boycotted Olympic movement to protest rival Taiwan's participation.
为了抗议竞争对手台湾的参与,共和国抵制奥运长达二十多年时间.
浏览量:3
下载量:0
时间:
我们都知道cure有治疗;治愈等意思,那么你知道cure out是什么意思吗?下面读文网小编为大家解释aaa的英语意思,欢迎大家参考学习!
用作动词 (v.)
cure of (v.+prep.)
用作名词 (n.)
cure for
cure of
浏览量:5
下载量:0
时间:
say是一个比较简单的单词,但是它的用法比较多,了解它的用法,才可以更好地运用它,让我们一起看看say的用法。下面是小编给大家带来的say是什么意思_say的用法总结,以供大家参考,我们一起来看看吧!
▼say是什么意思
作名词:
发言权; 说话; 要说的话; 发言权
作动词:
说, 讲; 表明,宣称
英语音标:
英 [sei] 美 [se]
▼say的用法
say的用法1:
say的基本含义是指把自己的思想或观点通过言语表达出来,使人明白其意图,即“说,讲”,着重所说话的内容,引申还可指“预告”“说明”“表明”“宣称”“背诵”等。
say的用法2:
say还可以作“比方说,假定说”解,是let's say的省略说法,用作插入语。
say的用法3:
say可用作及物动词,也可用作不及物动词。用作及物动词时,后可接名词、代词、动词不定式、带疑问词的不定式或that/wh-从句作宾语。也可引出直接引语。可用于被动结构。有时还可用一般现在时表过去。
say的用法4:
say作名词的意思是“决定权,发言权”,指人们对某一件事或物发表看法或观点之权。常用于单数形式,也可用作不可数名词。用单数形式时,常与不定冠词a连用。
say的用法5:
have a say意为“有发言权”; have the say意为“有决定权”; have said one's say意为“利用机会表达自己的意见”。
▼say的英语例句
1. All this, needless to say, had been culled second-hand from radio reports.
不用说,所有这些都是从电台报道中采集来的二手材料。
2. The deal seems so attractive it would be ridiculous to say no.
这笔交易看上去太诱人了,要是拒绝它简直是笑话。
3. People always think I'm a fool, and I dare say they're right.
人们总认为我是个傻瓜,想必他们是对的。
4. He won his first Derby on the aptly named "Never Say Die".
他驾驭着这匹名副其实的“永不言败”夺得了他的第一个德比马赛冠军。
5. Politicians say it could lead to a dissolution of parliament.
政客们说这可能会导致议会解散。
6. You have to be careful what you say on telly.
在电视上说话时你必须很谨慎。
7. They say it would be political suicide for the party to abstain.
他们说这个政党弃权无异于自毁政治前程。
8. Officials at the State Department say the issue is urgent.
国务院官员说该问题很急迫。
9. This, I am sorry to say, is almost entirely wishful thinking.
我很遗憾,这几乎完全是一厢情愿的想法。
10. I can't say any more, it's meant to be a big secret.
我再也无可奉告了,这本是重大的秘密。
11. You might say that we've been victims of circumstance.
你可以说我们一直不走运吧。
12. I'll say you started it, that you threw yourself at me.
我觉得是你主动向我投怀送抱。
13. His friends say he was always quick to tell a joke.
他的朋友们说,以前他讲笑话总是张嘴就来。
14. I'm sorry. That was a hateful thing to say.
对不起,我不该说那么难听的话。
15. It is impossible to say who struck the fatal blow.
很难判断是谁给了致命的一击。
浏览量:3
下载量:0
时间:
相信大家在英语中,会常常遇到want这个单词,也会经常考它的语法知识,那么want是什么意思?want又有哪些用法呢?下面是小编给大家带来的want是什么意思_want的用法总结,以供大家参考,我们一起来看看吧!
▼want是什么意思
现在分词: wanting
过去式: wanted
过去分词: wanted
▼want的用法总结
▼want的短语搭配
▼want的英语例句
浏览量:3
下载量:0
时间:
pull有拉,拔,拖等意思,pull做名词和动词分别都是什么意思你了解吗,下面读文网小编为大家带来pull的英语意思解释和相关例句,欢迎大家参考阅读!
现在分词: pulling 过去式: pulled 过去分词: pulled
浏览量:3
下载量:0
时间:
check表达的意思有很多种,那么你知道check做动词,名词分别都有哪些意思吗?下面读文网小编为大家带来check的英语意思解释和英语例句,欢迎大家一起学习!
英 [t?ek] 美 [t??k]
浏览量:3
下载量:0
时间:
blue表达的意思有很多种,那么你知道blue做动词,名词和形容词分别都有哪些意思吗?下面读文网小编为大家带来blue的英语意思解释和英语例句,欢迎大家学习!
1. She was a shy, delicately pretty girl with enormous blue eyes.
她是一个害羞、娇美的女孩,长着一双大大的蓝眼睛。
2. Queen Mary started the fashion for blue and white china in England.
玛丽女王开启了青花瓷在英格兰的流行风尚。
3. She stared dreamily out of the small window at the blue horizon.
她出神地看着小窗子外面的蓝色地平线。
4. They pried open a sticky can of blue paint.
他们撬开了一个黏糊糊的蓝色油漆桶。
5. He stared at me out of those washed-out blue eyes.
他用暗淡无神的蓝眼睛盯着我看。
6. Her silk shirtdress was sky-blue, the colour of her eyes.
她一袭天蓝色的真丝衬衫式连身裙,和她的双眸颜色一样。
7. The blue whale is the largest living thing on the planet.
蓝鲸是地球上体型最大的生物。
8. He put the flowers in a wide-mouthed blue vase.
他把花放进蓝色阔口花瓶里。
9. Whenever she refused, he'd beat her black and blue.
只要她拒绝他,他就会把她打得青一块紫一块。
10. A figure in a blue dress appeared in the doorway.
一个穿着蓝色连衣裙的身影出现在门口。
11. He felt strangely exhilarated by the brisk, blue morning.
那个凉爽而晴朗的早晨让他异常兴奋。
12. He has clear blue eyes and a dazzling smile.
他有一双清澈的蓝眼睛和一脸灿烂的微笑。
13. Red, white and blue bunting hung in the city's renovated train station.
红、白、蓝彩旗装点着该市修复一新的火车站。
14. Liz picked up the blue envelope and turned it over curiously.
莉兹拿起蓝色信封,好奇地翻过来看。
15. He wore a plain blue shirt, open at the collar.
他穿一件素净的蓝色衬衫,领口敞着。
浏览量:3
下载量:0
时间: