c++笔记-动态数组(new & allocator)

  1. new和deleta都是一次分配/释放一个对象,对于vector和string来所,在分配内存时,必须一次性为很多个元素分配内存。大多数应用应该使用标准库容器而不是动态分配的数组。使用容器更为简单、更不容易出现内存管理错误并且有可能有更好的性能。
  2. 我们所分配的动态数组,并不是得到数组对象,而是得到指向数组类型的指针。
int *pia = new int[10];
int *pia2 = new int[10]();
//10个int使用列表中对应的初始化器初始化
int *pia3 = new int[10]{0,1,2,3,4,5,6,7,8,9};
//10个string,前4个用给定的初始化器初始化,剩余的值初始化。
string *psa = new string[10]{"a", "s", "sd", string(3, 'x')};

在数组定义时,我们不能定义长度为0的数组
char arr[0];    //错误:不能定义长度为0的数组
char *cp = new char[0]; //合法操作,但是cp不能进行解引用操作
//当我们用new分配一个长度为0的数组时,new返回一个合法的非空指针。
  1. 当我们释放动态数组时,我们使用特殊形式的delete
delete p;   //p必须指向一个动态分配的对象或为空
delete [] pa;   //pa必须指向一个动态分配的数组或为空
销毁动态分配的数组时,从数组中最后一个元素开始,逆序销毁
#注意#
如果是销毁动态数组,一定要记得方括号!
  1. 智能指针中unique_ptr提供了一个管理动态数组的版本
//up指向一个包含10个未初始化的int的数组
unique_ptr<int[]> up(new int[10]);
up.release();   //自动用delete[]销毁其指针
值得注意的是,up指向的是一个int数组,而不是int,因此up销毁它管理的指针时,会自动使用delete[]
unique_ptr<T []> u;
unique_ptr<T []> u(p);
u[i]    //返回u拥有的数组中位置i处的对象
  1. allocator类帮助我们将分配内存与构造对象分离开了。其分配的内存是原始的,未构造的。
为了使用allocator,我们要定义一个allocator对象,并指明可以分配的对象类型
allocator<string> alloc;    //可以分配string的allocator
auto const p = alloc.allocate(n);   //分配n个未初始化的string

alloc.deallocate(p, n);     //释放p指针开始的内存。在调用deallocator之前,用户需为每个创建的对象调用destroy
                            //p必须是一个allocator返回的指针,n必须是p创建时所要求的大小
alloc.construct(p, args);   //使用args构造临时对象,在p所指的原始空间中创建
alloc.destroy(p);       //对p指向的对象执行析构算法

auto q = p;
alloc.construct(q++);   //*q为空字符
alloc.construct(q++, 10, 'c');  //*q为“cccccccccc”
alloc.construct(q++, "hi"); //*q为“hi”

cout << *q <<endl;  //错误,由于q++,所以q现在指向的是为分配的内存
cout << *p <<endl;  //正确,使用string的输出运算符

while(q != p)
    alloc.destroy(--q); //释放构建的string
//我们只能对构建的string进行destroy操作
  1. allocator对象的一些算法,定义在memory头文件中
uninitialized_copy(b, e, b2)    从迭代器b和e指出的输入范围内,拷贝元素到迭代器b2指定的未构造的原始内存中。
uninitialized_copy_n(b, n, b2)  从迭代器b指向的元素开始,拷贝n个元素到b2开始的内存中。b指向的内存要足够大
uninitialized_fill(b, e, t)     从迭代器b和e指定的原始内存范围内创建对象,都用初始值为t的填充对象
uninitialized_fill_n(b, n, t)   从迭代器b指向的内存地址开始,创建n个对象,都初始化为t。b指向的内存要足够大
copy函数返回指向最后一个元素之后的指针
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值