独占指针 std::unique_ptr
创始人
2024-05-03 05:47:57
0

学习智能指针之前需要知道的:

  • 智能指针是原始指针的封装,在头文件中,优点就是自动分配内存,不用担心潜在的内存泄漏。
  • 不是所有的指针都可以封装成智能指针,很多时候原始指针更方便。
  • 各指针中,最常用的还是裸指针,其次就是unique_ptr 和 shared_ptr
  • weak_ptr 是 shared_ptr 的一个补充,使用较少
  • auto_ptr 被弃用

智能指针只解决 独占 / 共享 所有权指针的释放、传输,没有根本上解决 C++ 内存安全问题


unique_ptr 独占指针

性质:

  • 在任何给定的时刻,只能有一个指针管理内存
  • 当指针超出作用域时,内存将自动释放
  • 该类型指针不可以 Copy,只可以 Move

创建方式:

  • 通过已有裸指针创建
  • 通过 new 创建
  • 通过 std::make_unique 创建

获取地址:

  • 类方法 get() 获取地址

-> 与 * :

  • 通过 -> 调用成员函数
  • 通过 * 调用 dereferencing

智能指针的使用

测试代码: 

#include 
#include class Stu {std::string m_name;public:Stu() {this->m_name = "stuTemp";std::cout << "无参构造" << std::endl;}Stu(std::string name) :m_name(name) {std::cout << "有参构造" << std::endl;}~Stu() {std::cout << "析构" << std::endl;}void printStuName() const {std::cout << this->m_name << std::endl;}
};int main() {/* 创建智能指针3种方法 */// 1、原始指针创建Stu* s_p1 = new Stu("stu1");std::unique_ptr u_s_p1{ s_p1 };u_s_p1->printStuName();// 2、new std::unique_ptr u_s_p2{ new Stu("stu2")};u_s_p2->printStuName();// 3、make_uniquestd::unique_ptr u_s_p3 = std::make_unique("stu3");u_s_p3->printStuName();//...//std::unique_ptr u_i_p1 = std::make_unique(10);//std::cout << "value:" << *u_i_p1 << std::endl;//std::cout << "address:" << u_i_p1 << std::endl;//std::cout << "address:" << u_i_p1.get() << std::endl;//std::cout << "address:" << u_s_p3.get() << std::endl;std::cout << "----------------" << std::endl;return 0;
}

运行结果:


unique_ptr 与 函数调用

传入值的方式:

  • 需要使用 std::move 来转移内存拥有权
  • 如果参数直接传入 std::make_unique 语句 自动转换为 move

传入引用的方式:

  • 如果设置参数为 const 则不能修改指向,eg:不能 reset()
  • reset() 方法为智能指针清空方法

函数返回值的方式:

  • 指向一个 local object
  • 可以用作链式函数

测试代码:

#include 
#include class Stu {std::string m_name;public:Stu() {this->m_name = "stuTemp";std::cout << "无参构造" << std::endl;}Stu(std::string name) :m_name(name) {std::cout << "有参构造" << std::endl;}~Stu() {std::cout << "析构" << std::endl;}void printStuName() const {std::cout << this->m_name << std::endl;}void setStuName(std::string name) {this->m_name = name;}
};void doWithStuPassValue(std::unique_ptr s) {s->printStuName();
}void doWithStuPassRef(const std::unique_ptr& s) {s->setStuName("JJ");s->printStuName();//s.reset(); // 清空
}std::unique_ptr getUniquePtr() {std::unique_ptr u_s_p1 = std::make_unique("Local");std::cout << "address:" << u_s_p1.get() << std::endl;return u_s_p1;
}int main() {// 1、passing by valuestd::unique_ptr u_s_p1 = std::make_unique("NN");doWithStuPassValue(std::move(u_s_p1)); // 使用 move 转移所有权//u_s_p1->printStuName(); // 使用已移动的对象doWithStuPassValue(std::make_unique("MM")); // 默认转换成 move 形式// 2、passing by referencestd::unique_ptr u_s_p2 = std::make_unique("KK");doWithStuPassRef(u_s_p2);//u_s_p2->printStuName();//std::cout << u_s_p2 << std::endl; // 0//std::cout << u_s_p2.get() << std::endl; // 0//u_s_p2->printStuName();// 3、Return by valuegetUniquePtr()->printStuName();return 0;
}

运行结果:

在函数参数方面,传入参数时,传入的是智能指针就需要使用 move 来转移内存拥有权,如果是直接传入 make_unique 语句,则会默认进行 move。

-

推荐使用的方法是将函数参数修改为 const 加 引用。 就可以直接传入智能指针。

相关内容

热门资讯

最早期的安卓系统,揭秘最早期安... 亲爱的读者,你是否曾好奇过,那个陪伴我们手机成长的安卓系统,它的起源究竟是怎样的呢?今天,就让我们一...
安卓双系统添加应用,轻松实现多... 你有没有想过,你的安卓手机里可以同时运行两个系统呢?听起来是不是很酷?想象一边是熟悉的安卓系统,一边...
pipo安卓进系统慢,探究pi... 最近是不是发现你的Pipo安卓系统更新或者运行起来特别慢?别急,今天就来给你好好分析分析这个问题,让...
怎样使用安卓手机系统,安卓手机... 你有没有发现,安卓手机已经成为我们生活中不可或缺的一部分呢?从早晨闹钟响起,到晚上睡前刷剧,安卓手机...
双系统安卓安装caj,轻松实现... 你有没有想过,你的安卓手机里装上双系统,是不是就能同时享受安卓和Windows系统的乐趣呢?没错,这...
安卓使用ios系统教程,安卓用... 你是不是也和我一样,对安卓手机上的iOS系统充满了好奇?想要体验一下苹果的优雅和流畅?别急,今天我就...
安卓系统gps快速定位,畅享便... 你有没有遇到过这样的情况:手机里装了各种地图导航软件,但每次出门前都要等上好几分钟才能定位成功,急得...
安卓手机系统更新原理,原理与流... 你有没有发现,你的安卓手机最近是不是总在提醒你更新系统呢?别急,别急,让我来给你揭秘一下安卓手机系统...
安卓系统通知管理,全面解析与优... 你有没有发现,手机里的通知就像是一群调皮的小精灵,时不时地跳出来和你互动?没错,说的就是安卓系统的通...
安卓系统手机哪买,揭秘哪里购买... 你有没有想过,拥有一部安卓系统手机是多么酷的事情呢?想象你可以自由安装各种应用,不受限制地探索各种功...
安卓系统 ipv4,基于安卓系... 你知道吗?在智能手机的世界里,有一个系统可是无人不知、无人不晓,那就是安卓系统。而在这个庞大的安卓家...
目前安卓是什么系统,探索安卓系... 亲爱的读者,你是否曾好奇过,如今安卓系统究竟是什么模样?在这个科技飞速发展的时代,操作系统如同人体的...
安卓6.0系统比5.0,从5.... 你有没有发现,自从手机更新了安卓6.0系统,感觉整个人都清爽了不少呢?没错,今天咱们就来聊聊这个话题...
安卓2.36系统升级,功能革新... 你知道吗?最近安卓系统又来了一次大变身,那就是安卓2.36系统升级!这可不是一个小打小闹的更新,而是...
安卓系统源码怎么打开,并可能需... 你有没有想过,安卓系统的源码就像是一扇神秘的门,隐藏着无数的技术秘密?想要打开这扇门,你得掌握一些小...
安卓8.0系统体验视频,智能革... 你有没有听说安卓8.0系统最近可是火得一塌糊涂啊!作为一个紧跟科技潮流的数码达人,我当然要来给你好好...
宣传系统漫画app安卓,探索安... 亲爱的读者们,你是否曾在某个午后,百无聊赖地打开手机,想要寻找一些轻松愉悦的读物?今天,我要给你介绍...
鸿蒙替换安卓系统吗,开启智能生... 你知道吗?最近科技圈里可是炸开了锅,因为华为的新操作系统鸿蒙系统,据说要大举进军手机市场,替换掉安卓...
手机安卓系统深度清理,解锁手机... 手机里的东西是不是越来越多,感觉就像一个装满了杂物的储物柜?别急,今天就来教你一招——手机安卓系统深...
安卓上的windows系统,融... 你有没有想过,在安卓手机上也能体验到Windows系统的魅力呢?没错,这就是今天我要跟你分享的神奇故...