当前位置: 首页 > news >正文

C语言,无法正常释放char*的空间

问题描述

#include <stdio.h>
#include <stdio.h>const int STRSIZR = 10;int main()
{char *str = (char *)malloc(STRSIZR*sizeof(char));str = "string";printf("%s\n", str);free(str);
}

乍一看,这块代码没有什么问题。直接书写时vscode也没有进行报错,可运行后便会弹出错误:

free(): invalid pointer

问题原因

开启断点调试

在第一次分配空间之后,str指针指向分配好的地址 0x5555555592a0

再执行一步,

此时str指针指向了地址 0x555555556008,此处为字符串"string"的存放地址,即text 区域(也称为代码段)

造成两个问题

  1. 释放代码段区域的空间必然导致错误(错误诱发原因)
  2. 原有分配的内存空间丢失

或许这也是使用g++编译时提示ISO禁止将string转化为char*的原因之一

问题解决

#include <stdio.h>
#include <stdio.h>
#include <string.h>const int STRSIZR = 10;int main()
{char *str = (char *)malloc(STRSIZR*sizeof(char));memset(str,0,STRSIZR*sizeof(char));strcat(str,"string");printf("%s\n", str);free(str);
}

拓展-结构体中的char*

#include <stdio.h>
#include <stdio.h>
#include <string.h>const int STRSIZR = 10;typedef struct node
{int index;char *name;
} Node;int main()
{char *str = (char *)malloc(STRSIZR*sizeof(char));memset(str,0,STRSIZR*sizeof(char));Node *n = (Node *)malloc(sizeof(Node));memset(n, 0, sizeof(Node));n->name=str;printf("%s\n", n->name);free(n);
}

考虑以上代码,运行后不报错。可真的没有问题吗?

未必,仍然考虑内存管理。使用valgrind帮我们一探究竟

valgrind --leak-check=full ./program

是的,当我们释放Node的时候,其实只是释放了char* name这个指针(8个字节)的这块空间。而并不会将其对应的分配内存空间释放。

#include <stdio.h>
#include <stdio.h>
#include <string.h>const int STRSIZR = 10;typedef struct node
{int index;char *name;
} Node;int main()
{char *str = (char *)malloc(STRSIZR*sizeof(char));memset(str,0,STRSIZR*sizeof(char));Node *n = (Node *)malloc(sizeof(Node));memset(n, 0, sizeof(Node));n->name=str;printf("%s\n", n->name);free(n->name);free(n);
}

先释放内部的char*,再释放整个结构体!

http://www.lryc.cn/news/527451.html

相关文章:

  • 重回C语言之老兵重装上阵(十五)C语言错误处理
  • 基于微信的课堂助手小程序设计与实现(LW+源码+讲解)
  • Effective C++ 规则50:了解 new 和 delete 的合理替换时机
  • Alfresco Content Services dockerCompose自动化部署详尽操作
  • 学习第七十六行
  • YOLOv11改进,YOLOv11检测头融合DynamicHead,并添加小目标检测层(四头检测),适合目标检测、分割等任务
  • 一个基于Python+Appium的手机自动化项目~~
  • 【后端开发】字节跳动青训营之性能分析工具pprof
  • Linux:线程池和单例模式
  • 使用iis服务器模拟本地资源服务器unityaddressables热更新出错记录
  • TikTok广告投放优化策略:提升ROI的核心技巧
  • Hash表
  • 题解:P10972 I-Country
  • linux常用加固方式
  • 笔灵ai写作技术浅析(二):自然语言处理
  • PyCharm介绍
  • 深度解析:基于Vue 3与Element Plus的学校管理系统技术实现
  • Python从0到100(八十五):神经网络-使用迁移学习完成猫狗分类
  • 苍穹外卖 项目记录 day09 历史订单
  • 记录 | 基于Docker Desktop的MaxKB安装
  • WordPress web-directory-free插件存在本地文件包含导致任意文件读取漏洞(CVE-2024-3673)
  • LLM:BERT or BART 之BERT
  • EtherCAT主站IGH-- 18 -- IGH之fsm_mbox_gateway.h/c文件解析
  • 深入探讨防抖函数中的 this 上下文
  • 【AI论文】魔鬼在细节:关于在训练专用混合专家模型时实现负载均衡损失
  • Gurobi基础语法之addVar 和 addVars
  • C语言学习阶段性总结(五)---函数
  • K8S 快速实战
  • java后端之事务管理
  • 【Redis】缓存+分布式锁