C++动态分配内存

操作符new和new[]


为了申请动态空间,我们需要使用new操作符。new操作会返回一个指针,它指向最新分配的空间的首地址。
使用new表达式的时候,先分配内存,并在该内存中构造一个对象。
如下所示
pointer = new type
pointer = new type [number_of_elements]

第一个式子是用来分配一个存储空间,它的大小等于一个type类型的大小;第二个式子用来分配一组存储空间,它的大小等于number_of_elements个type类型的大小。
int *bobby;
bobby = new int [5];

上面的例子中,系统会动态分配5个int大小的存储空间,然后返回指向第一个元素的指针bobby。因此,bobby指向一个有效的存储空间,它由5个int类型元素组成。
我们可以通过bobby[0]或者*bobby得到第一个元素的值。第二个元素可以通过bobby[1]和*(bobby+1)来得到。

动态数组所用的内存通常还包括“数组大小”的记录,以便delete知道需要调用多少次析构函数。单一对象的内存则没有这笔记录。

动态分配数据的初始化

隐性初始化

  • 对于类类型的对象,用该类的默认构造函数初始化
  • 而内置类型的对象则无初始化

显性初始化

  • 通过在类型后面加上一对内容为空的圆括号对动态创建的对象做值初始化
  • 类类型的对象,调用默认构造函数
  • 而内置类型的对象则会使用0或者null进行初始化

int *pi = new int;//pi指向未被初始化的int
int *pi = new int();//pi指向值初始化为0的int

操作符delete和delete[]


如果动态分配的空间不再需要,可以通过delete和delete[]进行释放。delete的形式如下
delete pointer;
delete []pointer;

第一个表达式被用来释放单独的变量,第二个表达式被用来释放动态申请的数组。
对于空指针,delete操作是合法的,但是不会起到任务作用。
delete表达式的时候,调用析构函数撤销对象,并将对象所用内存返回给系统。

静态数组和动态数组

静态分配数组分配发生在编译期间,而动态数组的空间分配发生在运行期间;动态数组分配发生在堆(Heap)上,而new动态数组是在堆中进行分配的。


函数调用结束时静态数组作为其栈中的局部变量会被释放,而堆中的动态数组没有调用delete不会被自动释放。所以如果想通过函数返回一个数组,应该在函数中用new动态创建一个数组,然后返回其首地址。

动态分配常见错误

  • 删除指向动态分配内存的指针失败,因而无法将该内存返还给自由存储区。
  • 读写已经删除的对象。
  • 对同一个内存空间使用两次delete表达式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值