动态内存会被自动释放吗?

函数体内的局部变量在函数结束时自动消亡。很多人误以为示例7-6是正确的。理由是p是局部的指针变量,它消亡的时候会让它所指的动态内存一起完蛋。这是错觉!

void Func(void)
{
    char *p = (char *) malloc(100);    // 动态内存会自动释放吗?
}

我们发现指针有一些“似是而非”的特征:

(1)指针消亡了,并不表示它所指的内存会被自动释放。

(2)内存被释放了,并不表示指针会消亡或者成了NULL指针。

这表明释放内存并不是一件可以草率对待的事。也许有人不服气,一定要找出可以草率行事的理由:

如果程序终止了运行,一切指针都会消亡,动态内存会被操作系统回收。既然如此,在程序临终前,就可以不必释放内存、不必将指针设置为NULL了。终于可以偷懒而不会发生错误了吧?

想得美。如果别人把那段程序取出来用到其它地方怎么办?

动态内存会被自动释放吗?

时间: 2024-10-11 12:41:47

动态内存会被自动释放吗?的相关文章

C语言动态内存的申请和释放

什么是动态内存的申请和释放? 当程序运行到需要一个动态分配的变量时,必须向系统申请取得堆中的一块所需大小的存储空间,用于存储该变量.当不再使用该变量时,也就是它的生命结束时,要显式释放它所占用的存储空间,这样系统就能对该堆空间进行再次分配,做到重复使用有限的资源. 下面将介绍动态内存申请和释放的函数 1.malloc函数 在C语言中,使用malloc函数来申请内存.函数原型如下: #include<stdlib.h> void *malloc(size_t size); 参数size代表需要动

动态内存分配函数与释放函数

(1)分配函数 void *malloc(sizeof(unsigned size) 功能:在内存的动态存储区中分配一块长度位size的连续空间. 返回值:指针,存放被分配内存的起始地址.若未申请到空间,则返回NULL(0). void *:指向任何类型的数据,在使用时,要进行强制类型转换. 例如:int *malloc(sizeof(int)) struct student *malloc(sizeof(struct student)) (2)释放函数 void free(void *ptr)

objective-C 的内存管理之-自动释放池(autorelease pool)

如果一个对象的生命周期显而易见,很容易就知道什么时候该new一个对象,什么时候不再需要使用,这种情况下,直接用手动的retain和release来判定其生死足矣.但是有些时候,想知道某个对象在什么时候不再使用并不那么容易.如果下面的代码,看上去非常简单: Sample.h类接口部分 #import @interface Sample : NSObject { } -(NSString*) toString; @end Sample.m 类实现部分 #import "Sample.h"

手动内存管理和自动释放池

手动内存管理 在进行内存管理的时候要注意内存管理的准则:谁开辟内存,谁释放内存(谁污染的谁治理) .开辟内存之后,对象的引用计数为1,只有继承自NSObject的对象才有内促管理的概念, 当对象引用计数为0的时候对象的内存会被清理. 下列关键字会开辟内存,对象引用计数器+1 alloc new copy mutableCopy 下列是内存管理的相关方法. retain :保留对象,对象的引用计数器+1. release : 释放对象,对象引用计数器-1. retainCount : 获取对象当前

Objective-C(8)内存管理之自动释放池

自动释放池 是一种半自动的内存管理方式 autorealease方法: - (instancetype)autorelease 此方法将对象放到自动释放池中,当自动释放池销毁时,池中的所有对象都会随之销毁. 常见的使用方式: Person *p = [[[Perosn alloc] init] autorelease]; 使用@autoreleasepool关键字来使用自动释放池 其后的{-}相当于自动释放池的生存期 ,如: @autoreleasepool {      Person *p =

《C语言中分配了动态内存后一定要释放吗?》

问:比如main函数里有一句 malloc(),后面没有free()1.那么当main结束后,动态分配的内存不会随之释放吗?2.如果程序结束能自动释放,那么还加上free(),是出于什么考虑? 答: 1. 就算没有free(),main()结束后也是会自动释放malloc()的内存的,这里监控者是操作系统,设计严谨的操作系统会登记每一块给每一个应用程序分配的内存,这使得它能够在应用程序本身失控的情况下仍然做到有效地回收内存.你可以试一下在TaskManager里强行结束你的程序,这样显然是没有执

C和C++动态内存的申请与释放思考

这里分配内存以数组为例,这样就建立了一种思维,肯定离不开数组与指针的关系,这两者的关系是一个永远的话题,具体的可以参见我的这篇文章,是关于数组与指针的下来我们开始动态内存分配方法之旅吧! C语言的: C++语言的: 版权声明:本文为博主原创文章,未经博主允许不得转载.

Objective-C----MRC内存管理 、 自动释放池 、 面向对象三大特性及封装 、 继承 、 组合与聚合

1 MRC练习 1.1 问题 引用计数是Objective-C语言采用的一种内存管理技术,当一个对象被创建在堆上后,该对象的引用计数就自动设置为1,如果在其它对象中的对象成员需要持有这个对象时,则该对象的引用计数被加上1,此时如果该对象被释放,内存管理程序将首先把该对象的引用计数减1,然后判断该对象的引用计数是否为0,由于其它对象在持有该对象时将引用计数加了1,所以此时该对象的引用计数减1后不为0,则内存管理程序将不会释放该对象.直到持有该对象的其它对象也被释放时,该对象的引用计数再次减1,变为

C++动态内存的分配与释放 引用

new 运算符 1.指针变量 = new 数据类型, 如:int *p: p=new int; 2.new从内存中卫程序分配一块内存空间,并返回指向该内存的首地址,该地址存放于指针变量中 new 先分配内存,做复杂类型的构造 delete 释放 delete运算符 delete 指针变量: 如:delete p: (1)用new获取内存空间,必须用delete进行释放 (2)对一个指针只能调用一次delete (3)用delete运算符作用的对象必须是用new分配的内存间的首地址 注:C语言中有