码迷,mamicode.com
首页 > 其他好文 > 详细

第十二章、动态内存

时间:2015-10-11 19:38:46      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:

一、动态内存与智能指针

1、new:在动态内存中为对象分配空间并返回一个指向该对象的指针;delete:接受一个动态对象的指针,销毁该对象,并释放与之关联的内存

2、两种指针:shared_ptr和unique_ptr;还有一个weak_ptr;都定义在memory中

二、shared_ptr类:智能指针也是模板,需要提供指向的类型

1、一个条件判断中使用智能指针,效果就是检测它是否为空

2、最安全的分配和使用动态内存的方法是调用make_shared的标准库函数

  • 返回指向此对象的shared_ptr
  • 通常用auto定义一个对象来保存make_shared的结果
  • auto p = make_shared<int>(42);

3、使用动态内存的原因三个

  • 程序不知道自己需要使用多少对象
  • 程序不知道需要对象的准确类型
  • 程序需要在多个对象间共享数据

4、对动态分配的对象进行初始化通常是个好主意:定义的时候就初始化

5、不能将一个内置指针隐式转换为一个智能指针,必须使用直接初始化形式

    shared_ptr<int> p(new int(1024));

6、不要混用普通指针和智能指针,除非我们需要向不能使用智能指针的代码传递一个内置指针

  • 比如shared_ptr不支持指针的算术运算,所以为了访问数组中的元素,必须使用get获取一个内置指针,然后来访问数组元素

7、避免智能指针陷阱

  • 不适用相同的内置指针值初始化(或reset)多个智能指针
  • 不delete get()返回的指针:当智能指针自己被销毁后,自动失效
  • 不使用get()初始化或reset另一个智能指针
  • 如果使用智能指针管理的资源不是new分配的内存,记住传递给他一个删除器
    • shared_ptr<connection> p(&c, end_connection);
    • 因为shared_ptr默认使用delete处理

三、unique_ptr类

1、定义一个unique_ptr时,必须绑定到一个new返回的指针上,且必须采用直接初始化形式

    unique_ptr<int> p(new int(42));
  • 不支持make_shared类似的操作:在c++14里出现了make_unique

2、unique_ptr拥有它指向的对象,因此unique_ptr不支持普通的拷贝或赋值操作,但有两个例外

  • 从函数返回一个unique_ptr
  • 返回一个局部对象的拷贝

3、可以通过release或reset将指针的所有权从一个非const的unique_ptr转移到另一个unique

4、向unique_ptr传递删除器,必须在尖括号中类型后,提供删除器类型:这里与shared_ptr的删除器不同

    unique_ptr<objT, delT> p (new objT, fcn);

四、weak_ptr:将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。最后一个指向对象的shared_ptr被销毁,对象就会释放

  • 由于对象可能不存在,所以要使用时,必须调用lock来判断weak_ptr指向的对象是否仍存在
    if(shard_ptr<int> np = wp.lock())
    {
        ...
    }
    • w.lock():如果计数为0则返回一个空的shared_ptr;否则返回一个指向w的对象的shared_ptr

五、动态数组

  • int *pia = new int[10];
  • delete []pia;pia前面必须有[]

第十二章、动态内存

标签:

原文地址:http://www.cnblogs.com/dylqt/p/4869777.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!