• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2022-11-30 22:12 Aet 隐藏边栏 |   抢沙发  9 
文章评分 2 次,平均分 5.0

模板

  1. 模板是一组函数或类的参数实现。
  2. 编译器能够在需要使用函数或类模板时,用模板生成一个具体的函数或者类的定义。
    1. 也可以定义参数化类型的模板,因此模板并不是可执行代码,而是用于生成代码的蓝图或配方
    2. 因此一个从来没有被使用过的模板,它会被编译器忽略,不会生成可执行代码。
    3. 也就是说,如果一个模板程序包含了一些编程错误,但这个模板程序没有被使用,那它包含的这些错误在编译阶段是不会被发现的。只有用于生成代码时,才会被编译器标识出来。

unique_ptr

简述

  1. unique_ptr<T>对象指向了一个对象,它独享了这个对象的所有权。

  2. 不能指定或复制一个unique_ptr<T>对象。

    1. 因此不能以传值的方式将一个unique_ptr<T>对象传入函数中,必须使用引用。
    2. 另外,unique_ptr<T>可以作为一个函数的返回值,原因是不会被拷贝,但是必须以隐式移动运算的方式返回。
      不会拷贝的原因是,函数的返回值,作为一个将亡值,编译器对这种情况会使用移动的方式。
  3. 可以使用std::move转义所有权

make_unique

get

  1. 返回unique_ptr<T>所包含的原始指针

reset

  1. 调用无参的reset,会析构它指向的对象,原生指针将会被替换成空指针
  2. 传参给reset,智能指针之前所指向的对象会被析构。传入的参数的地址值将被替换为新对象的地址值

release

  1. 释放一个unique_ptr<T>所指向的对象,这个函数可以在不释放对象内存的情况下,将指向它的unique_ptr<T>对象内容的原生指针设为空指针
  2. 返回所指对象的原生指针

swap

  1. 交换连个unique_ptr<T>指针的方式来交换两个对象

shared_ptr

简述

  1. 多个shared_ptr<T>对象可以指向同一个地址,所以shared_ptr<T>允许共享一个对象的所有权。
  2. 引用计数保存了了指向给定地址的shared_ptr<T>对象的数量。
    1. 每当有一个新的shared_ptr<T>对象指向一个特定堆地址时,引用计数就加1。
    2. 当一个shared_ptr<T>对象释放了或者指向了别的地址时,引用计数就减1。
    3. 当没有shared_ptr<T>指向这个地址时,引用计数将会变成0,在堆上为这个对象分配的内存就会释放。

make_shared

get

  1. shared_ptr<T>得到一个原生指针

reset

  1. 无参reset,使所指向对象的引用计数减1
  2. 有参reset,效果一致

use_count

  1. 返回当前被调用对象的实例个数

weak_ptr

  1. weak_ptr<T>只能从一个shared_ptr<T>对象创建,它们会指向相同的地址。
  2. 创建一个weak_ptr<T>不会增加shared_ptr对象的引用计数,所以它会阻止指向的对象销毁。
  3. 当最后一个shared_ptr<T>引用被释放或重新指向一个不同的地址时,它们所指向对象的内存将被释放,即使相关的weak_ptr<T>可能仍然存在。

expired

  1. 先判断所指向的对象是否依然存在
  2. 不存在,返回true

lock

  1. 如果weak_ptr<T>指向的对象依然存在,lock会返回一个新的shared_ptr<T>对象,锁住对象。
  2. 如果不存在,会返回一个具有空指针的shared_ptr<T>

使用weak_ptr的原因

  1. 避免在不经意间创建了一个循环引用
    1. 就是一个shared_ptr<T>对象pA,指向了另一个shared_ptr<T>对象pB,导致两个对象都不能被释放。
    2. 通过使用weak_ptr<T>指向一个shared_ptr<T>所指向的对象,就可以避免循环引用。原因是weak_ptr不会增加引用计数。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2023-02-06
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享