C/C++内存分配

内存分配不当有什么后果?

引起堆栈溢出、缓冲区溢出等问题,容易使得系统瘫痪和崩溃。

内存分配形式有哪些?

(1)由符号起始的区块(BSS)段:用来存放程序中未初始化的全局数据和静态数据的一块内存区域,BSS段属于静态内存分配,程序结束后静态变量资源由系统自动释放。

(2)数据段:用来存放程序中已初始化的全局变量的一块内存区域。也属于静态内存分配。

(3)代码段文本段:用来存放程序的执行代码的一块内存区域。区域大小运行前确定,一般允许可读,可以共享。

(4)堆:用于存放进程运行中被动态分配的内存段,大小不固定,可以动态扩张或缩减,由程序员负责分配和释放,分配方式类似于链表。

(5)栈:用于存放程序临时创建的局部变量,由编译器自动分配、释放内存。使用寄存器来存取,效率高,分配内存容量有限。

代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int global = 0; //全局初始化区
char *p1;       //全局未初始化区

int main()
{
    int a;                  //栈
    char s[] = "abcdefg";   //栈
    char *p2;               //栈
    char *p3 = "123456789"; // 123456789字符串在常量区,p3在栈上
    static int c = 0;       //全局(静态)初始化区
    p1 = (char *)malloc(100);
    p2 = (char *)malloc(200); //分配得来的100和200的区域就在堆区。
    strcpy(p1, "123456789");  // 123456789放在常量区,编译器可能会将它与p3所指向的
                              //“123456789”优化成一个地方
    return 0;
}

什么是内存泄漏?

一般指的是堆内存的泄露,是指程序分配内存后程序未能释放已经不再使用的内存的情况失去了对该内存的控制,因而造成了内存浪费。

频繁使用malloc和free有什么后果?

会产生内存碎片(类似磁盘碎片)

如何通过自定义的函数检测内存泄漏?

做一个标志信息说明申请内存空间的代码在哪个文件下的某一行,如何程序运行结束时没有释放内存,那就打印一行信息,如果已经释放,不打印提示信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑马金牌编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值