C++中malloc函数和free函数疑问
小弟初学。Malloc函数在申请内存是需要指明长度,而free函数释放内存的时候却不需要指明长度。如果我的代码如下:voidmain(){char*p=NULL;p=ma...
小弟初学。Malloc函数在申请内存是需要指明长度,而free函数释放内存的时候却不需要指明长度。如果我的代码如下:
void main()
{
char *p=NULL;
p=malloc(100);
free(p);
}
那么在释放内存的时候是释放100字节的内存呢?还是释放1个字节的内存?如果是100字节的话,free函数是如何知道释放长度为100字节的呢? 展开
void main()
{
char *p=NULL;
p=malloc(100);
free(p);
}
那么在释放内存的时候是释放100字节的内存呢?还是释放1个字节的内存?如果是100字节的话,free函数是如何知道释放长度为100字节的呢? 展开
4个回答
展开全部
类似LS所说,分配和释放内存是运行期决定的,因为是否有内存能够被分配取决于运行时的状况,无法在编译期确定。因此malloc得到的结果干脆不保存分配的长度,而让malloc/free等函数的实现决定。
不过LS所说过于绝对,一般的实现中,分配内存的底层可能确实是以查表的形式实现,但释放内存时释放的大小往往是由分配的内存本身决定的。具体来说,通常使用malloc(100)等方式请求获得100字节的内存时,实际返回的内存会略大于100字节,多出来的部分用于在内存开始几个字节储存这片连续内存的大小和其它可能需要的信息。free时根据这些信息来在分配用到的数据结构中标记这片内存的使用情况(一般是归还给缓存而不是操作系统,以照顾将来可能立即需要的再次分配)。这也能说明另外常见的两个问题:一是使用错误的参数进行free为什么容易造成程序崩溃;二是对于很小的内存(例如一个int大小)频繁使用malloc等动态方式分配空间效率极端低下。
====
[原创回答团]
不过LS所说过于绝对,一般的实现中,分配内存的底层可能确实是以查表的形式实现,但释放内存时释放的大小往往是由分配的内存本身决定的。具体来说,通常使用malloc(100)等方式请求获得100字节的内存时,实际返回的内存会略大于100字节,多出来的部分用于在内存开始几个字节储存这片连续内存的大小和其它可能需要的信息。free时根据这些信息来在分配用到的数据结构中标记这片内存的使用情况(一般是归还给缓存而不是操作系统,以照顾将来可能立即需要的再次分配)。这也能说明另外常见的两个问题:一是使用错误的参数进行free为什么容易造成程序崩溃;二是对于很小的内存(例如一个int大小)频繁使用malloc等动态方式分配空间效率极端低下。
====
[原创回答团]
参考资料: 原创
展开全部
释放的是100字节的内存。
p = malloc(100);在内存划一块100大小的,用P指向那块内存。
free(p),即释放P指针指向的空间。
p = malloc(100);在内存划一块100大小的,用P指向那块内存。
free(p),即释放P指针指向的空间。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
内存使用有一个内存维护表。
表里面记录了某块被占用的内存的起始地址和长度这些信息。
malloc这个函数执行之后,会在这个表里面添加相应的信息。
然后free的时候,会去查这个指针的值,在这个已占用内存的表中找这个起始地址,找到的话就,以会释放掉表中记录的内存区域,然后把这条记录删除。
如果找不到,程序报错.
表里面记录了某块被占用的内存的起始地址和长度这些信息。
malloc这个函数执行之后,会在这个表里面添加相应的信息。
然后free的时候,会去查这个指针的值,在这个已占用内存的表中找这个起始地址,找到的话就,以会释放掉表中记录的内存区域,然后把这条记录删除。
如果找不到,程序报错.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
void *malloc(
size_t size
);size_t:The maximum number of bytes to which a pointer can point
size_t size
);size_t:The maximum number of bytes to which a pointer can point
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询