认识 free指针背后(释放内存大小问题)
2009-09-23 09:45
323 查看
前一阵子帖过一篇关于free释放之后指针处理问题,现在来讲讲free内存大小的问题!
free只传一个指针,是怎么知道要释放的内存大小的呢,有学习过操作系统内存管理的人可能知道,我们申请一块内存的时候,(以下可能不同系统实现不一样):
申请成功,那么系统给我们是一个指针的地址,这个地址里面的某个地方存放着内存块的描述符(包括内存类型和大小)这样,free的时候系统会先读取这个描述符,返回再释放,所以能释放掉所有我们申请的内存,具体详细的还是的学习学习操作系统原理。
当我们得到一个指针的时候,我们可以对其类型做强制转换,这都不影响内存里面的实际空间大小,释放的时候系统还是能安全释放。
可是如果我们对指针地址做了修改,比如:
char *p = (char *)malloc(sizeof(char) * LEN);
int *i = (int *)p;
那么free(i),OK,没问题;
如果
i = (int *)p + 1;
free(i); 那么挂了,呵呵!
就是这样了,地址被你改变了,找不到内存块的描述符了,也就不知道内存的类型和大小,自然也就挂了!
不过这个存放描述符的地址每个系统都不一样(也有可能有一样的,^_^),里面的具体内容也不一样;
free只传一个指针,是怎么知道要释放的内存大小的呢,有学习过操作系统内存管理的人可能知道,我们申请一块内存的时候,(以下可能不同系统实现不一样):
申请成功,那么系统给我们是一个指针的地址,这个地址里面的某个地方存放着内存块的描述符(包括内存类型和大小)这样,free的时候系统会先读取这个描述符,返回再释放,所以能释放掉所有我们申请的内存,具体详细的还是的学习学习操作系统原理。
当我们得到一个指针的时候,我们可以对其类型做强制转换,这都不影响内存里面的实际空间大小,释放的时候系统还是能安全释放。
可是如果我们对指针地址做了修改,比如:
char *p = (char *)malloc(sizeof(char) * LEN);
int *i = (int *)p;
那么free(i),OK,没问题;
如果
i = (int *)p + 1;
free(i); 那么挂了,呵呵!
就是这样了,地址被你改变了,找不到内存块的描述符了,也就不知道内存的类型和大小,自然也就挂了!
不过这个存放描述符的地址每个系统都不一样(也有可能有一样的,^_^),里面的具体内容也不一样;
相关文章推荐
- free() 是如何释放不同内存区块大小的指针?
- malloc和free(3)——malloc()申请内存得到指针,通过memcpy()拷贝数据到指针所指内存,指针没有改变,调用free()释放内存不会报错
- 结构体包含二级指针和二级指针内存的申请与释放问题
- 含有指针成员的对象的内存的开辟和释放需要注意的问题
- 关于free如何知道要释放内存空间的长度问题
- 关于free如何知道要释放内存空间的长度问题(X86篇)
- strcat拼接两个字符指针后,释放内存崩溃问题
- free内存大小的问题
- (Boolan) C++ 类型大小和内存分布(虚函数指针、虚表、内存对齐问题)
- malloc和free(1)——malloc()申请内存得到指针,指针没有改变,用free()释放内存,不会报错
- 关于根据指针测定一块内存所占空间大小的问题
- SDUT OJ 2892 A (字典树问题-输出出现次数最多的字符串的出现次数,60ms卡时间,指针+最后运行完释放内存)
- 【C++】使用局部变量赋值而非引用,导致内存多次释放的野指针问题
- 关于free如何知道要释放内存空间的长度问题(ARM篇)
- 【C++】使用局部变量赋值而非引用,导致内存多次释放的野指针问题
- 认识 free指针背后
- 双指针指向同一内存的释放问题
- free/delete 释放的内存大小?
- malloc和free(2)——malloc()申请内存得到指针,指针被改动,用free释放内存报错
- c++指针存储应用程序和释放内存的问题