C语言 free() 内存释放问题

2024-08-21 13:58
文章标签 语言 问题 内存 free 释放

本文主要是介绍C语言 free() 内存释放问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载:https://blog.csdn.net/Zzy_ZhangZeyu_/article/details/24848569

 

我们知道free(p)是释放掉p所指向的内存,那么是释放了多长的一段内存呢?我们的系统是如何知道要释放多少内存的呢?下面我来讲讲这个问题。

 

请看下面一段代码

 

显然, pchar 和 pint 均被分配了4个字节的内存。

那么:

(1)    free(pchar);

(2)    free(pint);

这两条语句是释放了多少的内存呢?

语句(1)中是释放了8个字节的内存还是1个char数据所占的内存?

语句(2)中是释放了8个字节的内存还是1个int数据所占的内存呢?

 

    实际上,无论是语句(1)还是语句(2)都释放了8个字节内存,和他所指向的数据类型没有关系。决定free(p)释放多大的内存块,是在malloc的时候就已经确定了的,大多数实现分配存储空间的时候实际所分配的空间会比要求的大一些,额外的分配的空间会用来记录管理信息,比如分配块的长度,指向下一个分配块的指针等等...所以说你malloc分配了多少空间,free的时候就会释放相对应的空间大小。

 

再看下面一段代码

 

上面这段代码或许能够正常运行,但实际上是错误的。

 

上面这段代码没什么问题,问题出在下面的代码上

 

我们已经知道调用free的时候释放内存的大小是在malloc的时候就确定下来了的,一旦指针指向了malloc所分配的那段内存,内存释放的时候就会释放在malloc时所申请的那段大小(本例中是1000字节),如果改变了指针的指向,比如向后或者向前移动了一段位置,程序运行时往往会出现错误,而且该错误极其隐蔽。

 

上图给出了非常直观的图示便于理解。

 

 

 

这篇关于C语言 free() 内存释放问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093352

相关文章

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

java内存泄漏排查过程及解决

《java内存泄漏排查过程及解决》公司某服务内存持续增长,疑似内存泄漏,未触发OOM,排查方法包括检查JVM配置、分析GC执行状态、导出堆内存快照并用IDEAProfiler工具定位大对象及代码... 目录内存泄漏内存问题排查1.查看JVM内存配置2.分析gc是否正常执行3.导出 dump 各种工具分析4.

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对