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

迅睿cms建站幽默广告软文案例

迅睿cms建站,幽默广告软文案例,成都网页设计培训哪家好,人才网站怎么做欢迎拜访:雾里看山-CSDN博客 本篇主题:C语言动态内存管理(下) 发布时间:2025.3.18 隶属专栏:C语言 目录 动态内存常见错误内存泄漏(Memory Leak)典型场景后果解决方案 悬挂指针(Dangling Pointe…

欢迎拜访:雾里看山-CSDN博客
本篇主题:C语言动态内存管理(下)
发布时间:2025.3.18
隶属专栏:C语言

在这里插入图片描述

目录

  • 动态内存常见错误
    • 内存泄漏(Memory Leak)
      • 典型场景
      • 后果
      • 解决方案
    • 悬挂指针(Dangling Pointer)
      • 错误示例
      • 深层原理
      • 修复方案
    • 双重释放(Double Free)
      • 危险操作
      • 系统表现
      • 防护措施:
    • 越界访问(Out-of-Bounds)
      • 典型错误
      • 内存影响
    • 未初始化访问
      • 问题代码
      • 随机性危害
      • 防御性编程
    • 释放栈区内容
      • 错误示例
      • 解决方案
    • 未全部释放
      • 错误示例
      • 解决方案
  • C/C++程序的内存开辟

动态内存常见错误

内存泄漏(Memory Leak)

典型场景

void process_data() {int* buffer = malloc(1024 * sizeof(int));// 忘记调用 free(buffer)
}

后果

  • 程序持续运行时会不断消耗内存
  • 长期运行的服务可能因此崩溃

解决方案

  • 遵循申请与释放成对出现原则
  • 使用RAII模式(C可用__attribute__((cleanup))扩展)

悬挂指针(Dangling Pointer)

错误示例

int* create_int() {int value = 42;return &value; // 返回局部变量地址
}int main() {int* ptr = create_int();printf("%d", *ptr); // 不可预测结果
}

深层原理

  • 栈帧销毁后,原地址可能被其他数据覆盖
  • 堆内存释放后若未置空,指针仍保存失效地址

修复方案

及时释放,释放后立即置空

free(ptr);
ptr = NULL; // 立即置空

双重释放(Double Free)

危险操作

对同一地址空间进行多次释放

char* str = malloc(64);
free(str);
free(str);

系统表现

  • 可能立即引发segmentation fault
  • 可能破坏堆管理结构导致后续malloc失败

防护措施:

  • 使用释放后置空的编程规范
  • 在复杂逻辑中明确资源所有权

越界访问(Out-of-Bounds)

典型错误

数组只开辟了[0,4]的空间,访问时却访问了下标为5的空间。

int* arr = malloc(5 * sizeof(int));
for(int i=0; i<=5; i++) { // 索引0-4有效arr[i] = i; // i=5时越界
}

内存影响

  • 可能覆盖相邻内存的控制信息
  • 可能修改其他变量值导致逻辑错误

未初始化访问

问题代码

内存开辟出来未进行初始化就直接访问。

int* p = malloc(sizeof(int));
printf("%d", *p);

随机性危害

  • 可能意外修改关键内存区域
  • 在不同运行环境中表现不一致

防御性编程

指针定义时显示初始化, 指针使用时进判空。

int* p = malloc(sizeof(int));
*p = 10;
printf("%d", *p);

释放栈区内容

错误示例

对于非动态开辟出来的内存进行释放

void test()
{int a = 10;int *p = &a;free(p);
}

解决方案

  • 遵循申请与释放成对出现原则
  • 使用RAII模式(C可用__attribute__((cleanup))扩展)

未全部释放

错误示例

在释放内存的时候,创建时的指针和原来的指针已经不在同一个位置,直接释放则会有内存错误。

void test()
{int *p = (int *)malloc(100);p++;free(p);
}

解决方案

在创建的时候,使用一个指针记录起始位置,

void test()
{int *p = (int *)malloc(100);int *ptr=p;p++;free(ptr);
}

C/C++程序的内存开辟

在这里插入图片描述
C/C++程序内存分配的几个区域:

  1. 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。
  2. 堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。分配方式类似于链表。
  3. 数据段(静态区)(static)存放全局变量、静态数据。程序结束后由系统释放。
  4. 代码段:存放函数体(类成员函数和全局函数)的二进制代码。

实际上普通的局部变量是在栈区分配空间的,栈区的特点是在上面创建的变量出了作用域就销毁。
但是被static修饰的变量存放在数据段(静态区),数据段的特点是在上面创建的变量,直到程序结束才销毁所以生命周期变长。

⚠️ 写在最后:以上内容是我在学习以后得一些总结和概括,如有错误或者需要补充的地方欢迎各位大佬评论或者私信我交流!!!

http://www.dtcms.com/wzjs/334136.html

相关文章:

  • 网站建设 维护 运营情况报告获客软件排名前十名
  • 徐州做网站需要多少钱上海网站推广排名公司
  • 网站开发ppt转h5淘宝竞价排名
  • sap.net怎么做网站seo销售
  • 电脑课做网站所需的软件关键词歌曲
  • 精美ppt模板免费下载网站网站优化排名服务
  • 怎么根据别人的网站做自己的网站非企户百度推广
  • vs网站开发效果图微信推广平台怎么做
  • 在哪些网站做外贸好网站维护合同
  • 东莞常平牙科湖南网络优化
  • 新手怎么做网站seo具体优化流程
  • 网站怎么做子网页数字营销课程
  • 江门网站制作软件去哪里找需要推广的app
  • 哪个网站建设营销型网站是什么意思
  • 做网站的公司叫什么名字怎么自己搭建网站
  • 凡客诚品官网的关闭原因seo优化方式包括
  • 佛山网站建设怎么做高级搜索指令
  • 网站如何被收录情况网络营销的主要推广方式
  • 集团网站设计思路想学编程去哪里找培训班
  • 麓谷网站建设免费网站入口在哪
  • 网站制作百度资源万能优化大师下载
  • 承接各类网站建设厦门seo小谢
  • 云南微网站制作哪家好ui设计
  • 专门做网站的百度app内打开
  • 怎么发布php网站移动惠生活app下载网址
  • 网站域名地址查询seo优化专员工作内容
  • 网站开发框架 c百度贴吧官网首页
  • 做留言的网站厦门网站制作全程服务
  • 2022年即将上市的手机seo短视频入口
  • 上海网站建设 分类广告手机百度提交入口