12.2 Dynamic Arrays

很重要的要记住动态数组没有数组类型

 

初始化数组列表时,当array.size() < allocate array size 时,剩余部分被初始化为null;反之,fail

 

当我们使用new去分配一个大小为0的数组时,new返回一个有效的,非零的指针

 

在数组中的元素被倒序摧毁

 

当我们使用unique_ptr指向一个数组时,我们不能使用 或者 -> 访问操作符

 

对于shared_ptr来说没有下表访问操作符,智能指针不支持指针算术

 

操作 说明
unique_ptr<T[]> u u能够指向一个动态分配类型为T的数组
unique_ptr<T[]> u(p) u指向内置指针p所指向的动态分配的数组
u[i] 返回u拥有数组中位置i处的对象;u必须指向一个数组

 

 

更重要的是,类如果没有默认构造方法,不能使用动态分配一个数组

 

操作 说明
allocator<T> a  
a,aloocate(n) 分配原始的,未构造的内存储存n个类型为T的对象
a.deallocate(p, n)

释放n个类型为T,以p为起始地址的内存

 a.construct(p, arg)  
 a.destroy(p) 运行析构函数释放p指向地址的内存。 

 

 

使用allocator分配的内存是未构造的。

#include <iostream>
#include <string>
#include <memory>

using namespace std;

int main()
{
    allocator<string> alloc;
    auto p = alloc.allocate(10);//分配十个单位的空间, p指向起地址

    auto q = p;//指针q作为位置移动
    alloc.construct(q++, "hello");//第一个位置"hello"
    alloc.construct(q++, "world!");//第二个位置"world!"

    cout << *p << endl;//输出第一个单位内存的数据
    //cout <<< *q << endl;q指向未构造内存
    system("PAUSE");
    return 0;
}

 

while(q != p)
    alloc.destroy(--q);
//一个一个清楚p指向内存中的数据,将之变为""

 

alloc.deallocatr(p, n)
//释放内存,n的大小必须和在allocate使用大小相同
posted @ 2018-11-24 18:42  Hk_Mayfly  阅读(344)  评论(0)    收藏  举报