关于free函数的描述错误的是()
发布网友
发布时间:2022-04-30 15:45
我来回答
共2个回答
热心网友
时间:2022-06-26 16:21
cd
free()到底释放了什么
这个问题比较简单,其实我是想和第二大部分的题目相呼应而已!哈哈!free()释放的是指针指向的内存!注意!释放的是内存,不是指针!这点非常非常重 要!指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,所以说 是垃圾。因此,前面我已经说过了,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了。非常重要啊这一点!
好了!这个“题外话”终于说完了。就这么简单说一次,知道个大概就可以了!下面就进入第三个部分:
三、malloc()以及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()的源代码倒是容易简单很多。只是有个疑问,下面指出!
// code...
void free(void *ptr)
{
struct mem_control_block *free;
free = ptr - sizeof(struct mem_control_block);
free->is_available = 1;
return;
}
热心网友
时间:2022-06-26 16:22
答案不是cd
关于free函数的描述错误的是()
事实上,仔细看一下free()的函数原型,也许也会发现似乎很神奇,free()函数非常简单,只有一个参数,只要把指向申请空间的指针传递 给free()中的参数就可以完成释放工作!这里要追踪到malloc()的申请问题了。申请的时候实际上占用的内存要比申请的大。因为超出的空间是用来记录对这块内存的管理信息。先看...
在c语言中有关free的用法错误,求指点。
free只能释放堆里内存.
C中free()的问题
free函数对应的是malloc返回给你的指针,free将指针指定的内存空间释放,如果发现指定的内存空间不是在与malloc匹配的内存空间,free操作就会失败,会告诉你一个堆不可用的错误。 你在调用free之前改变了其最初指向的内存空间,所以会出错。
c\c++里关于free()函数的小疑惑。。。
1。连后面也释放了 因为你对这块空间的访问是通过首地址给指针变量a来实现的,释放a后,你也就没法访问这块空间了 2。是不一样的 动态分配存储空间是分配在SDRAM上,程序读入也是在SDRAM上,就是我们通常所说的内存,区别是动态分配存储空间在内存的数据段,而程序放在内存的代码段 而静态RAM,是通常...
关于free()函数的疑问
可以,返回的地址就是分配的地址,可以使用free来释放的,但要注意不要重复释放或使用释放后的指针。
关于函数free的问题
1,char *p=NULL;/*必须给一个空指针,否则它指向一个不确定地址,不是空,所以free执行。*/ 2,char *p="gaza";/***静态分配不可以用free释放***/
关于C语言free函数的问题?
简单解释:你用malloc申请一个3平米的房间,房卡是a 你告诉计算机,房间不用了,但是你没有把a还回去,就是没有让a=null 如果房间没有新人来,你还可以用a开门,并且看到你睡过的床、用过的毛巾。但是很快,房间有新人入住了,但是没有换房卡(也换不了)。这时你用a开门进去,面临的将是很严重...
关于C语言free函数的问题
一般delete是和new配对的,free和malloc配对的!!其释放的是p所指向的空间,即内存地址!!但是指针变量没有变成NULL,其还是指向原来开辟的空间,但是此空间被释放了,所以其就是一个“野指针”,指针所指向的内容是”垃圾“,因此释放空间的时候,建议也把指针变成空指针!!!以免误用!!
一个关于free函数的问题,大家帮忙看看
free指针之后,释放指针所指向的内存空间,但是该指针指向的内存地址不变,不是NULL,但是指向的内存已无效不应该再使用。你可以自己赋值NULL,表明指针无效不指向任何内存。C++中的delete也是一样的。
关于free()函数用法问题
只释放head指针所指向的1个结构体。可以这样 while(head->next!=null){ student* tmp=head;head=head->next;free(tmp);}