C的动态内存管理

本文详细介绍了C语言中的动态内存管理,包括malloc、calloc、realloc和free等函数的使用,以及内存泄漏、迷途指针的概念和处理方法。特别强调了内存泄漏的危害和预防措施,同时探讨了C的内存分配技术,如资源获取即初始化(RAII)和异常处理在内存管理中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.动态内存分配
  1. 使用malloc类的函数分配内存
  2. 使用分配的内存来支持应用程序
  3. free函数释放内存
    如下,分配内存并为内存中填充数据:
int* p = (int*)malloc(sizeof(int));
*p = 990715;               //为开辟的内存填充数据
free(p);                   //释放开辟的内存

其中malloc函数的参数指定分配内存的字节数。分配成功,返回从堆上分配的内存的地址;分配失败,返回空。sizeof操作符使得程序具有更好的移植性,因为不同的机器系统可能对不同的数据类型有不同的字节分配数,所以使用该操作符可以在不同的系统上得到正确的字节数。
注意: 每次调用malloc等类似函数时,程序结束时要调用free函数释放内存,防止出现内存泄漏
一旦被free之后,就不能再次解引去访问其值。通常我们会将释放的指针赋值为NULL.

1.1. 内存泄漏

未将不再使用的内存空间释放就可能发生内存泄漏。通常引起内存泄漏的原因有如下:

  1. 丢失内存地址
  2. 未调用free函数释放(隐式泄漏)

什么是内存泄漏:
内存泄漏的一个问题就是无法回收内存并加以重复利用,堆管理器可用内存越来越少。内存被不断的分配并丢失。当需要更多的内存malloc而又不能分配时程序可能就会终止,因为内存耗尽。严重时,会导致系统崩溃。
如下的例子:

char *ch;
while(true){
   
	ch = (char*)malloc(1000000);
	cout << "FEEL" << endl;
}

其中ch变量是指向堆上分配的内存,但是,在下一次的循环之前,即指向另一块新的内存之前没有释放当前指向的内存,如下下去,程序会将内存耗尽而中断,即使没有中断,可利用的内存也将会极大的降低。

1.1.1 丢失地址
int *p = (int*)malloc(sizeof(int));     //开辟内存
*p = 1999;

p = (int*)malloc(sizeof(int));          //将指向堆内存的指针指向另一块内存空间

这样的话,没有释放第一次所开辟的内存空间,就指向了新开辟的内存空间,就会导致第一次所分配的空间的地址丢失,造成无法引用,释放,形成内存泄漏。

另一种例子如下:

char* name = (char*)malloc(strlen("FEEL") + 1);
strcpy(name,"FEEL");            //为分配的内存空间赋值
while(*name != 0){
                 //逐个输出每个字符
	printf("%c",*name);
	name++;
}

上述几行代码,在每一次的循环当中,name都会加1,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一倾而尽

你的鼓励将是我最大的动力,谢谢

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

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

打赏作者

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

抵扣说明:

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

余额充值