c++考点之动态分配内存


#如题:

##答案为:
int *pi=new int;

知识点:

C/C++定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区即堆(heap)区或自由存储区(free store)

操作系统的内存静态分配与动态分配,分别对应哪个区呢?静态分配对应全局变量区,动态分配都是在堆中进行的。在静态分配时c与c++基本没什么区别,但在动态分配时c++专门提供了new与delect来进行。

c++堆内存申请和释放格式为:

申请变量:

指针变量名=new 类型名(初始化式);//初始化式:其实就是普通的初始化操作,初始化可省。new运算符返回的是一个指向所分配类型变量(对象)的指针。对所创建的变量或对象,都是通过该指针来间接操作的,而且动态创建的对象本身没有名字。

delete 指针名;

申请数组:

Type * pi= new Type[N];// N指数组大小,数组元素个数,并非字节数
delete[] pointer;    // 数组的释放,需要在delete后面加[],和变量有区别
                     // delete[]  说明所要释放的指针是指向一片数组空间的,释放整个数组空间,如果用delete的话,pointer指向的是数组的首元素地址,释放的就是首元素的内存空间,其余元素的内存空间并没有释放,会造成内存泄漏

使用注意事项:

⑴.动态分配失败。返回一个空指针(NULL),表示发生了异常,堆资源不足,分配失败。
          data = new double*[m]; //申请行
          if ((data ) == 0)……

⑵.指针删除与堆空间释放。删除一个指针p(delete p;)实际意思是删除了p所指的目标(变量或对象等),释放了它所占的堆空间,而不是删除p本身,释放堆空间后,p成了空悬指针,不能再通过p使用该空间,在重新给p赋值前,也不能再直接使用p。

⑶.内存泄漏(memory leak)和重复释放。new与delete 是配对使用的, delete只能释放堆空间。如果new返回的指针值丢失,则所分配的堆空间无法回收,称内存泄漏,同一空间重复释放也是危险的,因为该空间可能已另分配,所以必须妥善保存new返回的指针,以保证不发生内存泄漏,也必须保证不会重复释放堆内存空间。

⑷.动态分配的变量或对象的生命期。无名对象的生命期并不依赖于建立它的作用域,比如在函数中建立的动态对象在函数返回后仍可使用。我们也称堆空间为自由空间(free store)就是这个原因。但必须记住释放该对象所占堆空间,并只能释放一次,在函数内建立,而在函数外释放是一件很容易失控的事,往往会出错。

c堆内存申请和释放格式为:

函数原型:void *malloc(unsigned int size);

函数的作用是:在内存的动态存储区开辟一个size个字节的连续空间,返回所分配区域的首字节地址。 
可以看到,函数返回值是一个void指针,请注意,void指针不是一个可以指向任何类型数据的指针,而是 说,不指向任何类型的数据,仅仅是提供了一个地址。
因而,你想让这个指针指向int型数据,要进行显式的类型转换(强制类型转换),即在前面加(int *)。一般来说,如果不加,是可以自动进行隐式类型转换的。。如果分配失败,则返回一个空指针(NULL)。

函数原型:void *calloc(unsigned n,unsigned size)

作用:开辟n个长度为size的连续空间。一般用来保存一个数组。

函数原型:void free(void *FirstByte)//释放空间

使用注意事项:

A、申请了内存空间后,必须检查是否分配成功。
B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。
C、这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会
出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。
D、虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一些编译器的检查。

与c中动态分配的不同:

new关键字与malloc函数的区别:

new关键字是C++的一部分,malloc是由C库提供的函数
new以具体的类型为单位进行内存分配,malloc以字节为单位进行内存分配
new在申请单个类型变量时可以进行初始化,malloc不具备内存初始化的特性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

guangod

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

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

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

打赏作者

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

抵扣说明:

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

余额充值