C++:34---动态数组(new)

一、动态数组的定义

  • 数组的维度可以为常量、也可以为一个函数的返回值
int size()
{
    return 3;
}
const int length = 3;

int *p1 = new int[size()]{1,2,3};
int *p2 = new int[length];
int *p3 = new int[3];
  • 使用typedef为数组类型取别名
typedef int arrT[42];
int *p=new arrT;  //分配一个大小为42的int型数组

二、动态数组的初始化

  • 默认情况下,new分配的对象都有默认初始化
int *p1=new int[10];   //10个未初始化的int
int *p2=new int[10](); //10个初始化为0的int
string *p3=new string[10];  //10个空的string
string *p4=new string[10]();//10个空的string
  • C++11标准:花括号初始化器初始化
int *p1=new int[5]{0,1,2,3,4};
string *p3=new string[3]{"a","the",string(3,'x')}; 
  • bad_array_new_length异常:当初始化数目大于元素数目时,new表达式失败,抛出此异常。此异常定义在new头文件中

三、动态数组的一些注意事项

  • ①因为new申请的数组是动态地,因此不能使用begin()和end()函数对动态数组进行操作
  • ②不能使用for each对数组进行遍历,但是可以使用for循环操作动态数组
int *p1 = new int[3]{1,2,3};  //动态数组
int p2[3]= { 1,2,3 };  //普通数组

for (int i = 0; i < 3; i++) //正确
    cout <<p1[i] << endl;
for each (int var in p2)//错误
{

}

四、动态分配一个空数组是合法的

  • 动态分配一个数组是合法的,new返回一个合法的非空指针,此指针保证与new返回的其它任何指针都不相同。但是不能对此指针解引用
  • 普通数组定义一个空数组是不允许的
int arr[0];  //错误
int *p = new int[0];  //正确

五、动态数组的释放

  • 使用delete释放,并且在数组名前需要加上“[]”
  • 释放的顺序:数组中的元素按照逆序销毁,即最后一个元素首先被销毁,然后倒数第二个....以此类推
typedef int arrT[10];

int *p=new arrT;
delete []p;

六、unique_ptr与动态数组的使用

  • 标准库提供了一个可以管理new分配的数组的unique_ptr版本
unique_ptr<int[]> arr(new int[3]{ 1,2,3 }); //定义一个指向int型数组的智能指针对象
unique_ptr<int[]> arr2(new int[3]);
arr.release();  //自动调用delete[]销毁其指针
unique_ptr<int[]> arr= new int[3]{ 1,2,3 };  //错误

unique_ptr类操作数组的方法: 

  • 动态数组的访问:unique_ptr操作数组,不提供点和箭头成员运算符,因为数组不是一个对象。但是可以通过下标运算符来访问操作数组
unique_ptr<int[]> arr(new int[3]{ 1,2,3 });
for (int i = 0; i < 3; ++i)
        arr[i] = i;

七、shared_ptr与动态数组的使用

  • 与unique_ptr不同,shared_ptr不直接支持管理动态数组。如果希望使用shared_ptr管理动态数组,必须提供自己定义的删除器
  • 如果未提供删除器,shared_ptr默认使用delete删除动态数组,此时delete少一个“[]”,因为会产生错误
//本例中,传递给shared_ptr一个lambda作为删除器

shared_ptr<int> sp(new int[10], [](int *p) { delete[] p; } );
shared_ptr<int> sp2(new int[3]{1,2,3}, [](int *p) { delete[] p; });
sp2.reset();  //使用自己书写的lambda释放数组
  • 动态数组的访问:shared_ptr不支持点和箭头成员运算符访问数组,并且不提供下标运算符访问数组,只能通过get()函数来获取一个内置指针,然后再访问数组元素
shared_ptr<int> sp(new int[3]{1,2,3}, [](int *p) { delete[] p; });
for (size_t i = 0; i != 3; ++i)
        *(sp.get() + i) = i;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

董哥的黑板报

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

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

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

打赏作者

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

抵扣说明:

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

余额充值