动态数组

new n e w delete d e l e t e

class Node {
public:
    int a;
    Node() {
        a = 1;
    }
    Node(int x) : a(x){}
    ~Node() {
        cout << "********" << endl;
    }
};

int L, W, H;
L = 2;
W = 2;
H = 2;
Node ***array = new Node **[H];
for (int i = 0; i < H; i++) {
    array[i] = new Node *[L];
    for (int j = 0; j < L; j++) {
        array[i][j] = new Node[W];
    }
}
for (int i = 0; i < H; i++) {
    for (int j = 0; j < L; j++) {
        delete[] array[i][j];
    }
    delete array[i];
}
delete array;
/*
********
********
********
********
********
********
********
********
*/
char arr[0];//错误
char *arr = new char[0];//正确

当用 new n e w 分配一个大小为0的数组的时候, new n e w 返回一个合法的非空指针。此指针保证与 new n e w 返回的其他任何指针都不相同。此指针可以加减0,但是不能解引用。

delete[] d e l e t e [ ] 会销毁数组中的元素并释放对应的内存,数组中的元素按逆序销毁。 new n e w 会调用构造函数, delete d e l e t e 会调用析构函数。

class Node {
public:
    int a;
    Node() {
        a = 1;
        cout << a << endl;
    }
    Node(int x) : a(x){ 
        cout << a << endl; 
    }
    ~Node() {
        cout << a << endl;
    }
};
Node *a = new Node[5]{ 1,2,3,4,5 };
delete[] a;
/*
1
2
3
4
5
5
4
3
2
1
*/

智能指针与动态数组

unique_ptr u n i q u e _ p t r 可以管理动态数组:

unique_ptr<int []> up(new int[10]);
up.release();//自动调用delete[] 销毁指针

up[i];//调用

shared_ptr s h a r e d _ p t r 无法直接管理动态数组,必须提供定义的删除器,并且访问数组中的元素需要用get:

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


for( size_t i = 0; i != 10; i++)
    *(sp.get() + i) = i;

allocator a l l o c a t o r

allocator a l l o c a t o r 非配原始的、未构造的内存。
这里写图片描述

allocator<string> alloc;
auto const p = alloc.allocator(n);//分配n个未初始化的string

auto q = p;
alloc.construct(q++);
alloc.construct(q++,10,'c');
alloc.construct(q++, "hi");

cout << *p << endl;//正确
cout << *q << endl;//错误,未构造的内存

while( q != p)
    alloc.destroy(--q);

alloc.deallocator(p, n);

拷贝和填充未初始化内存的算法
这里写图片描述
函数均返回一个指针,指向最后一个构造元素之后的位置。

auto p = alloc.allocator(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、付费专栏及课程。

余额充值