博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ Primer 笔记——动态数组
阅读量:5137 次
发布时间:2019-06-13

本文共 1832 字,大约阅读时间需要 6 分钟。

1.动态数组定义时也需要指明数组的大小,但是可以不是常量。

int i;int arr[i];    // 错误,数组的大小必须为常量int *p = new int[i];    // 正确,大小不必是常量

2.虽然我们通常称 new T[ ] 分配的内存为动态数组,但我们并未得到一个数组类型的对象,而是得到一个数组元素类型的指针。所以不能对动态数组调用begin或end,也不能用for语句来处理动态数组中的元素。

 

3.默认情况下,new分配的对象,不管是单个分配的还是数组中的,都是默认初始化的。我们可以用空括号对数组中元素进行值初始化,但是不能在括号中给出初始化器,这意味着不能用auto分配数组。

int *p = new int[3];    // 3个未初始化的intint *p1 = new int[10]();    // 3个值初始化为0的intint *p2 = new int[3]{ 1, 2, 3 };    // 列表初始化

4.虽然我们不能创建一个大小为0的静态数组,但是可以动态分配一个空数组,此时new返回一个合法的非空指针,此指针保证与new返回的其他任何指针都不相同。对于零长度的数组来说,此指针就像尾后指针一样,我们可以从此指针减去自身从而得到0.但是此指针不能解引用。

 

5.我们可以用delete [ ] 来释放数组,数组中的元素按逆序销毁,并释放对应的内存。

 

6.标准库提供了一个可以管理new分配数组的unique_ptr版本。

std::unique_ptr
p(new int[3]);p[0] = 1; // 为第一个元素赋值p.release(); // 自动用delete[]销毁其指针

 

7.与unique_ptr不同,shared_ptr不直接支持管理动态数组,如果希望使用shared_ptr管理动态数组,必须提供自己定义的删除器。shared_ptr未定义下标运算符,而且智能指针类型不支持指针算术运算。因此,为了访问数组中的元素,必须用get获取一个内置指针,然后用它来访问数组元素。

std::shared_ptr
p(new int[10], [](int *p) {
delete[] p; }); // 使用lambda释放数组for (std::size_t i = 0; i != 10; ++i) *(p.get() + i) = i; // 使用get获取一个内置指针

 

8.allocator是一个模板,它帮助我们将内存分配和对象构造分离开来,分配的内存是原始的,未构造的,当一个allocator对象分配内存时,会根据给定的对象类型来确定恰当的内存大小和对齐位置。

std::allocator
alloc; // 可以分配string的allocatorauto const p = alloc.allocate(3); // 分配n个未初始化的stringauto q = p; // q指向最后构造的元素之后的位置alloc.construct(q++); // *q为空字符串alloc.construct(q++, 2, 'c'); // *q为"cc"alloc.construct(q++, "test"); // *q为"test"std::cout << *p << std::endl; // 正确,p指向第一个构造的元素std::cout << *q << std::endl; // 错误,q指向未构造的内存while (q != p) alloc.destroy(--q); // 执行了指向对象的析构函数 // 元素被销毁后我们可以重新用这部分内存构造新对象,也可以将其归还给系统:alloc.deallocate(p, 3); // 注意这里的p不能为空,而且大小参数必须与分配时一样

 

9.标准库还为allocator类定义了两个伴随算法,可以在未初始化内存中创建对象。

 

转载于:https://www.cnblogs.com/zoneofmine/p/7291750.html

你可能感兴趣的文章
pair的例子
查看>>
前端框架性能对比
查看>>
uva 387 A Puzzling Problem (回溯)
查看>>
12.2日常
查看>>
Oracle中包的创建
查看>>
django高级应用(分页功能)
查看>>
【转】Linux之printf命令
查看>>
关于PHP会话:session和cookie
查看>>
STM32F10x_RTC秒中断
查看>>
display:none和visiblity:hidden区别
查看>>
C#double转化成字符串 保留小数位数, 不以科学计数法的形式出现。
查看>>
3月29日AM
查看>>
利用IP地址查询接口来查询IP归属地
查看>>
HTML元素定义 ID,Class,Style的优先级
查看>>
构造者模式
查看>>
http和https的区别
查看>>
Hbuild在线云ios打包失败,提示BuildConfigure Failed 31013 App Store 图标 未找到 解决方法...
查看>>
找到树中指定id的所有父节点
查看>>
今天新开通了博客
查看>>
AS3优化性能笔记二
查看>>