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

C语言-内存管理

1、malloc()函数

        用于动态分配一块指定大小的内存,并返回指向这块内存的指针。如果分配失败,

        返回 NULL。 

int* ptr = (int*)malloc(sizeof(int) * 10);  // 分配一个包含 10 个整数的内存
if (ptr == NULL) {
    printf("Memory allocation failed!\n");
}

2、free() 函数

        用于释放之前通过 malloc()calloc()realloc() 分配的内存。释放内存后,

        指针仍然存在,但指向的内存不再有效。因此,通常会将指针设置为 NULL 以避免悬空指针。

free(ptr);  // 释放之前分配的内存
ptr = NULL;  // 防止使用悬空指针

3、内存溢出、内存越界

        内存存放的数据空间超过申请空间大小,操作超过申请空间大小。 

4、 内存泄漏

        如果分配的内存没有被及时释放,程序将消耗越来越多的内存,导致系统性能下降,

        甚至崩溃。这种现象被称为“内存泄漏”。

        为防止内存泄漏

                确保每次调用 malloc()后都要有相应的 free() 调用。

5、堆和栈的区别

        

1. 内存分配方式

  • 栈(Stack)

    • 内存的分配是自动管理的,遵循先进后出(LIFO)原则。
    • 当函数被调用时,相关的局部变量和参数会在栈上分配内存;当函数返回时,这部分内存会自动释放。
  • 堆(Heap)

    • 内存的分配是手动管理的,通过程序员调用特定的内存分配函数(如 malloc 或 new)。
    • 堆中的内存可以在程序的任何地方分配和释放,程序员需要显式释放使用 free 或 delete

2. 生命周期

    • 栈内存中的变量的生命周期仅限于它们被创建的函数调用,函数返回后,内存会自动释放。
    • 堆内存中的变量的生命周期是由程序员控制的,可以在需要时分配,直到显式释放为止。

3. 内存大小

    • 栈的大小通常是有限的,具体大小取决于操作系统和编译器的设置,通常为几 MB。
    • 堆的大小通常比栈大,受限于系统的可用内存。程序可以动态请求更大的内存块。

4. 存储内容

    • 存储的是函数的局部变量、参数、返回地址等临时数据。
    • 存储的是动态分配的对象和数据结构,如链表、树等,通常用于需要动态大小的情况。

5. 访问速度

    • 栈的访问速度较快,因为其分配和释放是简单的指针移动。
    • 堆的访问速度相对较慢,因为分配和释放需要更多的时间进行内存管理和找寻适合的内存块。

6. 错误处理

    • 栈溢出(stack overflow)可能导致程序崩溃,通常是在递归调用或分配太多局部变量时发生。
    • 堆溢出(memory leak)通常是由于未释放的内存,导致消耗过多内存,增加了程序崩溃的风险。

总结

栈和堆是内存管理中不可或缺的部分,各自适用于不同的场景。栈适合用于存储临时数据,速度快且管理简单,而堆适合存储大量不确定大小的动态数据,虽然需要更多的管理工作。了解它们的区别对于优化程序性能和避免内存问题至关重要。

      

http://www.kler.cn/a/516165.html

相关文章:

  • PL/SQL语言的图形用户界面
  • WPF5-x名称空间
  • 电脑办公技巧之如何在 Word 文档中添加文字或图片水印
  • 仅仅4M!windows系统适用,免费无限制使用!
  • 基于 WEB 开发的手机销售管理系统设计与实现内容
  • .NET 9 微软官方推荐使用 Scalar 替代传统的 Swagger
  • 一个面向领域的直播平台开源!
  • Codeforces Round 1000 (Div. 2)(A-D)
  • 安宝特方案 | 智能培训:安宝特AR如何提升企业技能培训的效率与互动性
  • Zookeeper启动指定JDK版本
  • 【深度学习】神经网络实战分类与回归任务
  • WIN11 UEFI漏洞被发现, 可以绕过安全启动机制
  • 汇编实验·循环程序设计
  • 论文阅读 Multi-view Classification Using Hybrid Fusion and Mutual Distillation
  • Linux系统下速通stm32的clion开发环境配置
  • 数量4-经济、最值、周期
  • 安卓14自由窗口圆角处理之绘制圆角轮廓线
  • 天天AI-20250121:全面解读 AI 实践课程:动手学大模型(含PDF课件)
  • 【数据结构】顺序队列与链式队列
  • MySQL 主从复制(单组传统复制,GTID复制。双主复制)
  • qml ColorDialog详解
  • 【Unity】 HTFramework框架(五十九)快速开发编辑器工具(Assembly Viewer + ILSpy)
  • 没有屋檐的房子-023粪堆旁边的舞蹈
  • 国内股票年化收益回归分析(上)
  • 深度学习|表示学习|卷积神经网络|参数共享是什么?|07
  • 【MySQL】 库的操作