工程建设网站,互联网行业是干什么的,潍坊做网站的公司,河南省住房和城乡建设网站
目录
1--动态内存管理
2--shared_ptr类
2-1--make_shared 函数
2-2--引用计数
2-3--get
3--new和delete
4--shared_ptr和new结合使用
5--unique_ptr
6--weak_ptr 1--动态内存管理 new#xff1a;在动态内存中为对象分配空间并返回一个指向该对象的指…
目录
1--动态内存管理
2--shared_ptr类
2-1--make_shared 函数
2-2--引用计数
2-3--get
3--new和delete
4--shared_ptr和new结合使用
5--unique_ptr
6--weak_ptr 1--动态内存管理 new在动态内存中为对象分配空间并返回一个指向该对象的指针 delete接受一个动态对象的指针销毁该对象并释放与之关联的内存 C11新标准两类智能指针负责自动释放所指向的对象 ① shared_ptr允许多个指针指向同一个对象 ② unique_ptr指针独占所指向的对象 ③ weak_ptr指向 shared_ptr 所管理的对象是一种若引用不会递增引用计数 2--shared_ptr类
2-1--make_shared 函数 make_shared 函数在动态内存中分配一个对象并进行初始化返回指向该此对象的shared_ptr 使用 make_shared 必须显式指定对象的类型 std::shared_ptrint p std::make_sharedint(42);
2-2--引用计数 每个 shared_ptr 都有一个关联的计数器其称为引用计数当拷贝一个 shared_ptr 时计数器会递增当用一个 shared_ptr 初始化另一个 shared_ptr或者将其作为参数进行传递以及作为函数的返回值时都会使关联的计数器递增当给 shared_ptr 赋予一个新值或是 shared_ptr 被销毁即离开局部作用域时计数器会递减 当一个 shared_ptr 的计数器为 0 时会自动释放管理的对象 2-3--get get 函数返回一个内置指针指向智能指针管理的对象get 用来将指针的访问权限传递给代码只有确定代码不会 delete 指针的情况下才能使用 get。 std::shared_ptrint p(new int(42));
int *q p.get();
{std::shared_ptrint(q);
}// 程序块结束q被销毁
int foo *p; // 未定义p指向的内存已经被释放
3--new和delete new 无法为其分配的对象命名只返回一个指向该对象的指针 默认情况下动态分配的对象是默认初始化的没有默认构造函数的内置类型将是未定义的 对动态分配的对象进行值初始化只需在类型名后跟一对空括号即可 int *pi1 new int; // 默认初始化*pi1的值未被定义
int *pi2 new int(); // 值初始化*pi2的值为0 delete 销毁给定指针所指向的对象并释放对应的内存 当 delete 一个指针后指针变为空悬指针指向一块曾经保存数据对象但已无效的内存的指针对 delete 后的指针赋予 nullptr 表明指针不指向任何对象避免空悬指针的相关问题 int *p(new int(42)); // p 指向动态内存
auto q p; // p和q指向相同的内存
delete p; // p和q均变为无效
p nullptr; // 指出 p 不再指向任何对象
4--shared_ptr和new结合使用 可以使用 new 返回的指针来初始化智能指针接受指针参数的智能指针构造函数是 explicit 的即必须使用直接初始化形式来初始化智能指针不能通过内置指针隐式转换为一个智能指针 std::shared_ptrint p1 new int(1024); // 错误
std::shared_ptrint p2(new int(1024)); // 正确// 错误
std::shared_ptrint clone(int p){return new int(p);
}// 正确
std::shared_ptr clone(int p){return std::shared_ptrint(new int(p));
}
5--unique_ptr 不同于 shared_ptr某个时刻只能有一个 unique_ptr 指向一个给定的对象 定义 unique_str 时需要将其绑定到一个 new 返回的指针上初始化 unique_ptr 必须采用直接初始化形式 std::unique_ptrint p(new int(42)); 由于 unique_str 拥有它指向的对象因此 unique_ptr 不支持普通的拷贝或赋值操作 不能拷贝或赋值 unique_ptr但可以通过调用 release 或 reset 将指针的所有权从一个unique_ptr 转移到另一个 unique_ptr // 所有权从 p1 转移给 p2release 将p1置为空
std::unique_ptrstd::string p2(p1.release());std::unique_ptrstd::string p3(new std::string(xxxxx));
p2.reset(p3.release()); // p2释放原来指向的内存所有权从p3转移给p26--weak_ptr weak_ptr 指向由一个 shared_ptr 管理的对象将一个 weak_ptr 绑定到一个 shared_ptr 不会改变 shared_ptr 的引用计数一旦 shared_ptr 的引用计数为0weak_ptr也会相应自动释放 使用 weak_ptr 访问对象前必须调用 lock 判断对象是否存在如果对象存在lock 返回一个指向共享对象的 shared_ptr auto p std::make_sharedint(42);
std::weak_ptrint wp(p); // wp若共享pp的引用计数未改变
if(std::shared_ptrint np wp.lock()){.... // np 与 p 共享对象
}