C++Primer第5版读书笔记(第12章)

第12章 动态内存
12.1 动态内存与智能指针

  1. shared_ptr允许多个指针指向同一个对象;unique_ptr则“独占”所指向的对象。标准库还定义了一个名为week_ptr的伴随类,它是一种弱引用,指向shared_ptr所管理的对象,这三种类型都定义在memory头文件中。
    C++Primer第5版读书笔记(第12章)_第1张图片
  2. 只有当括号中仅有单一初始化器时才可以使用auto:
auto p1 = new auto(obj);    //p指向一个与obj类型相同的对象
                            //该对象用obj进行初始化
auto p2 = new auto{a,b,c};  //错误:括号中只能有单个初始化器
 3. 用new分配const对象是合法的,但必须进行初始化。

12.1.3 shared_ptr和new结合使用

  1. 可以使用new返回的指针来初始化智能指针,但是接受指针参数的智能指针构造函数是explicit的,因此,不能将一个内置指针隐式转换为一个智能指针,必须使用直接初始化形式。
shared_ptr<int> p1 = new int(1024); //错误:必须使用直接初始化形式
shared_ptr<int> p2(new int(1024));  //正确:使用了直接初始化形式

C++Primer第5版读书笔记(第12章)_第2张图片
C++Primer第5版读书笔记(第12章)_第3张图片

 2. 不要混合使用普通指针和智能指针,无法知道对象何时会被销毁;也不要使用get初始化另外一个智能指针或为智能指针赋值。
 3. 基本规范

     - 不使用相同的内置指针值初始化(或reset)多个智能指针;
     - 不delete get()返回的指针;
     - 不使用get()初始化或reset另一个智能指针;
     - 如果使用get()返回的指针,当最后一个对应的智能指针销毁后,该指针就变为无效了;
     - 如果使用智能指针管理的资源不是new分配内存,需传递给它一个删除器。

 4. 类似shared\_ptr,初始化unique\_ptr必须采用直接初始化形式,unique\_ptr不支持普通的拷贝或赋值操作;

C++Primer第5版读书笔记(第12章)_第4张图片

 5. 向后兼容:auto\_ptr,不能在容器中保持auto\_ptr,也不能在函数中返回auto_ptr.
 6. weak\_ptr是一种不能控制所指向对象生存期的智能指针,它指向由一个shared\_ptr管理的对象。将一个weak\_ptr绑定到一个shared\_ptr不会改变shared\_ptr的引用计数。一旦最后一个指向对象的shared\_ptr被销毁,对象就会被释放。即使有weak\_ptr指向对象,对象也还是会被释放。

C++Primer第5版读书笔记(第12章)_第5张图片
C++Primer第5版读书笔记(第12章)_第6张图片

 7. 与unique_ptr不同,shared\_ptr不直接支持管理动态数组。如果希望使用shared\_ptr管理一个动态数组,必须提供自己定义的删除器。

12.2.2 allocator类
allocator类定义在memory中,construct成员函数接受一个指针和零个或多个额外参数,在给定位置构造一个元素。额外参数用来初始化构造的对象,这些额外的参数必须是与构造的对象的类型相比配的合法的初始化器。
C++Primer第5版读书笔记(第12章)_第7张图片
C++Primer第5版读书笔记(第12章)_第8张图片
假定有一个int的vector,希望将其内容拷贝到动态内存中,分配一块比vector中元素所占用空间大一倍的动态内存,然后将原vector中的元素拷贝到前一半空间,对后一半空间用一个给定值进行填充:

auto p = alloc.allocate(vi.size()*2);
auto q = uninitialized_copy(vi.begin(), vi.end(), p);
uninitialized_fill_n(q, vi.size(), 42);

你可能感兴趣的:(C++)