动态数组相关知识

文章探讨了C++中的动态内存分配,如`new`关键字,以及如何使用unique_ptr和shared_ptr进行内存管理。还介绍了allocator模板类用于预先分配内存以避免浪费,并展示了如何使用construct和destroy操作进行对象构造和销毁。
摘要由CSDN通过智能技术生成

为数组new动态内存

int *p=new int[42]

或者

typedef int arrT[42];
int *p=new arrT;

注意:

  • 动态数组不是数组类型,并能调用begin或end,也不能用for;只能使用数组维度来返回指向首位的指针。与常规数组的区别在于,初始化的时候不可以在圆括号里用初始化器,(auto根据初始化器判断类型)所以不能用auto分配动态数组。
  • 创建一个大小为0的动态数组是合法的,但不可以对其指针解引用(不指向任何元素)

释放动态指针:delete [] pa;,最后一个元素首先被销毁

智能指针和动态数组

1.用unique_ptr管理动态数组

unique_ptr<int[]> up(new int[10]);
up.release();

2.用shared_ptr管理指针,要定义删除器;当访问元素时,用sp.get()可以获得sp中保存的指针

shared_ptr<int> sp(new int[10],[](int *p){delete[] p;});
sp.seset();

allocator模板类

要解决的问题:在创建对象之前预先分配大块的存储空间肯能会导致存储空间的浪费(数组中元素的个数n<MACSIZE)
当allocator对象分配内存时,会根据给定的对象类型来确定恰当的内存大小和对齐位置

# include <memory>
allocator<striing> alloc;
auto const p=alloc.allocator(n);
auto q=p;//q指向最后构造元素之后的位置(未构造内存)
alloc.construct(q++,10,'x');//对于未构造内存,只能使用construct构造元素(不能用元素类型的构造函数,只能拷贝)

while(q!=p)
	alloc.destroy(--q);//用完对象后要销毁
alloc.dealocate(p,n);//释放内存
a.deallocate(p,n)释放从指针p中地址开始的内存
a.construct(p,args)在p指向的内存中构建一个对象
a.destory( p )对p指向的对象执行析构函数
a.construct(p,args)在p指向的内存中构建一个对象

拷贝填充未初始化内存:

auto p=alloc.allocate(vi.size()*2);
auto q=uninitialized_copy(vi.begin(),vi.end(),p);
uninitialized_fill_n(q,vi.size(),42);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值