1 一次性分配较大内存,free如何获知该内存大小并完全释放,实现机制是?
2 如下代码:
int *p = (int*)malloc(sizeof(int));
free((char*)p);
什么情况下会出现内存泄漏?
3 <c prime>一书一个版本在高级数据结构一节中写过如下代码:
while(p != NULL){
free(p);
p = p->next;
}
这样的用法是否永远可行?
while(p != NULL){
free(p);
p = p->next;
}
上面这一段是 链表结构,同时,这一段是错误的。因为先释放,后引用。
我们来说这个问题“ 一次性分配较大内存,free如何获知该内存大小并完全释放,实现机制是”
可以参考这个:
https://blog.csdn.net/mmshixing/article/details/51679571
看不懂?没关系,简单来说,你看到的内存,并不是真正的内存。malloc 机制会额外维护一套数据,里面保存了
当前的数据的大小、位置等等,他都帮你做了。所以,你不必关心你申请了多少内存。
(glibc 的)malloc 等函数在分配时会记录每块内存的起始位置和大小
看你加 C++ 标签了,但问的问题似乎仅仅是 C。在 C 语言中,一般是不转换 malloc 的返回值的类型的。通常情况下不会有问题。当 char 的大小比 int 小时由于整型截断,会出问题的(不是内存泄漏那么简单)。但是好像找不到这两种指针大小不一样的系统了吧?
永远不可行,因为它在逻辑上是错误的。一、另一线程可以在你访问之前使用了该内存块;二、内存分配器可以为了安全起见将已释放的内存清零;三、其它情况。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。