12.1 动态内存与智能指针
1.shared_ptr允许多个指针指向同一个对象,unique_ptr独占所指向的对象,weak_ptr指向shared_ptr所管理的对象,三者都定义在memory头文件中
2.shared_ptr独有的操作:
1) make_shared(args)
auto sp = make_shared("Hello, shared_ptr!");
2) shared_ptr p(q)(拷贝构造)
auto sp1 = make_shared(10); // sp1 指向 int(10),引用计数 = 1
shared_ptr sp2(sp1); // 拷贝构造,sp1 和 sp2 共享对象,引用计数变为2
3)p=q(赋值操作)让p放弃原有对象(引用计数递减),转而共享q的对象(q的引用计数递增)
auto sp1 = make_shared(10); // sp1 指向 int(10),计数 = 1
auto sp2 = make_shared(20); // sp2 指向 int(20),计数 = 1
sp1 = sp2; // sp1 放弃原对象(计数 1→0,原 int(10) 内存释放),共享 sp2 的对象(计数 1→2)
4)p.unique() 判断p是否为对象的唯一所有者(引用计数为1)
auto sp = make_shared(10);
cout sp2(sp);
cout
5)p.use_count() 返回当前shared_ptr共享对象的引用计数(一般用于调试
3.auto+new场景括号中只能有单一初始化器
4.释放一块非new分配的内存,或者将相同的指针值释放多次,其行为是未定义的,传递给delete的指针必须指向动态分配的内存或者空指针
5.delete以后指针会变成空悬指针(即为指向曾经保存数据对象但现在已经无效了的内存的指针),可置为nullptr,但这个方法对其他指向这个无效内存的指针是没有作用的
6.用new返回的指针初始化智能指针
shared_ptr p(new int(42));
7.内置指针就是普通指针
8.使用get返回的指针不能被delete
9.可用reset将一个新的指针赋予一个shared_ptr
// 创建一个 shared_ptr,指向值为 10 的 int 对象
shared_ptr p = make_shared(10);
cout
// 正确写法:用 reset 替换指向的对象
p.reset(new int(1024));
10.shared_ptr默认只认动态内存出来的,销毁时只会调用delete去释放内存,但是我们要管理的不只有动态内存,还有文件句柄,网络连接,数据库连接这类,此时需要调用特定函数
void end_connection(connection *p) {
disconnect(*p); // 用 disconnect 释放连接,而不是 delete
}
// 创建 shared_ptr 时,传入删除器
shared_ptr p(&c, end_connection);
11.初始化unique_ptr必须采用直接初始化形式,不支持拷贝或者赋值
12.unique_ptr操作
1)创建一个空的不指向任何对象的
unique_ptr u1; // 空指针,不指向任何 string
2)创建一个空的,但释放资源时不用默认的delete,而是用指定的可调用对象D
unique_ptr u2;
unique_ptr u(d);//d为自定义释放器
3)释放当前指向的对象,然后让他变成空指针
u=nullptr;
4)u 放弃对指针的 “所有权”,返回原始指针,同时 u 变为空。注意:调用 release 后,你必须自己手动管理返回的指针(否则会泄漏)。
u.release();
5)释放u当前指向的对象,让u变为空,类似nullptr,但更强调主动重置
u.reset();
6)如果传了指针q,会先释放当前指向的对象,然后指向q,如果传nullptr同理
u.reset(q);
13.weak_ptr不控制所指向对象的生存期,它指向一个由shared_ptr管理的对象,将它绑定后不会影响shared_ptr的引用计数,一旦最后一个shared_ptr被销毁,对象就会被释放,即使有weak_ptr指向对象
14.1)与shared_ptr sp指向相同对象
//俩者类似
weak_ptr w(sp);
w=sp;
2)将w置空
w.reset();
3)计算与w共享对象的shared_ptr的数量
w.use_count();
4)若与其共享的shared_ptr数量为0则返回true,否则返回false
w.expired();
5)若expired为true返回一个空的shared_ptr,否则返回一个指向w的对象的shared_ptr
w.lock();
12.2 动态数组
1.释放动态数组
delete[] p;
2.unique_ptr 可以管理new分配的数组
unique_ptr up(new int[10]);
3.allocator类可以将内存分配和对象构造分离开,只分配内存,然后可以用construct来构造对象,用完对象需要调用destory来销毁
文章来源于互联网:c++primer学习周总结(第十二章)
相关推荐: 【AI风向标】大模型参数量到底有多大?带你了解 ChatGPT、Kimi、文心一言的底层实力
本文原创作者:姚瑞南 AI-agent 大模型运营专家/音乐人/野生穿搭model,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 📌…
5bei.cn大模型教程网










