当前位置: 首页 > article >正文

4种智能指针

C++11 中提供了四种智能指针类型:unique_ptr、shared_ptr、weak_ptr 和 auto_ptr(已废弃)。以下是对四种智能指针的举例说明:

1. unique_ptr

unique_ptr 是一种独占式智能指针,它拥有对对象的唯一所有权,不能被多个 unique_ptr 对象共享。当 unique_ptr 对象被销毁时,它所管理的对象也会被销毁。unique_ptr 的使用示例:```c++

#include <iostream>
#include <memory>

using namespace std;

int main() {
    unique_ptr<int> p(new int(10));
    cout << *p << endl; // 输出 10
    *p = 20;
    cout << *p << endl; // 输出 20
    return 0;
}


```

2. shared_ptr

shared_ptr 是一种共享式智能指针,可以被多个 shared_ptr 对象共享同一个对象,当最后一个 shared_ptr 对象销毁时,它所管理的对象也会被销毁。shared_ptr 使用引用计数来管理对象的生命周期。shared_ptr 的使用示例:```c++

#include <iostream>
#include <memory>

using namespace std;

int main() {
    shared_ptr<int> p1(new int(10));
    shared_ptr<int> p2(p1);
    cout << *p1 << endl; // 输出 10
    cout << *p2 << endl; // 输出 10
    *p1 = 20;
    cout << *p2 << endl; // 输出 20
    return 0;
}


```

3. weak_ptr

weak_ptr 是一种弱引用智能指针,不能单独管理对象的生命周期,它只能指向被 shared_ptr 管理的对象,用于解决 shared_ptr 循环引用的问题。weak_ptr 不会增加对象的引用计数,当最后一个 shared_ptr 对象销毁时,weak_ptr 不会影响对象的销毁。weak_ptr 的使用示例:```c++

#include <iostream>
#include <memory>

using namespace std;

int main() {
    shared_ptr<int> p1(new int(10));
    weak_ptr<int> p2(p1);
    cout << *p1 << endl; // 输出 10
    cout << *(p2.lock()) << endl; // 输出 10
    *p1 = 20;
    cout << *(p2.lock()) << endl; // 输出 20
    return 0;
}


```

4. auto_ptr

auto_ptr 是一种自动指针,可以自动管理对象的生命周期,但它已经被废弃,不再建议使用。auto_ptr 在将资源转移给另一个 auto_ptr 时,会自动释放原来的资源,可能会导致不可预期的行为。auto_ptr 的使用示例:```c++

#include <iostream>
#include <memory>

using namespace std;

int main() {
    auto_ptr<int> p1(new int(10));
    auto_ptr<int> p2(p1);
    cout << *p2 << endl; // 输出 10
    return 0;
}


```

以上是四种智能指针的使用示例,需要注意的是,智能指针并不是万能的,需要根据实际情况选择合适的智能指针类型,避免出现问题。


http://www.kler.cn/a/18461.html

相关文章:

  • 物联网(RFID)全景:被装信息化监控应用与挑战
  • 卸载一直显示在运行的应用
  • Rust:GUI 开源框架
  • 一文了解珈和科技在农业遥感领域的服务内容和能力
  • Nebula NGQL语言的使用 一
  • JavaScript数组去重的实用方法汇总
  • PMP证书“扫盲”时间2023年考证人快看过来
  • 基于springboot的医院信管系统
  • 备忘录模式
  • 网络路径下倾斜模型生产流程-空三计算,像控刺点
  • vue_组件基础
  • chatgpt的150个指令大全
  • GraphHopper调研笔记
  • Linux | Ubuntu配置JDK源码编译环境
  • canvas的三种渲染模式的区别
  • 点对点通讯的好处和坏处?能否实现及时通讯?
  • 树莓派系统配置-raspi-config
  • [python] Python类型提示指北
  • 多媒体通信有些SCI期刊推荐? - 易智编译EaseEditing
  • Java线程池编码示例
  • 【模拟IC学习笔记】 反馈
  • 人脉社交社群运营系统源码
  • python能成为编程届的网红么?
  • 【算法题】2401. 最长优雅子数组
  • 自动修改文章的软件-文章原创软件
  • 常用工作负载