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

C++智能指针入门教程(C++11)

智能指针

1.定义

​ C++中的智能指针是一种用于自动管理动态分配的内存的模板类,它们通过封装原始指针来提供自动的内存管理功能,从而避免了内存泄漏和悬挂指针等问题。C++标准库中提供了几种智能指针类型,其中最常用的是std::unique_ptrstd::shared_ptrstd::weak_ptr

​ C++智能指针是在C++11版本中引入的。C++11及以后版本废弃了C++98中的auto_ptr,并从Boost标准库中引入了shared_ptrunique_ptrweak_ptr三种智能指针,以提供更强大和灵活的内存管理机制。

2.std::unique_ptr

  • 表示对对象的独占所有权,同一时间内只有一个std::unique_ptr可以指向某个给定对象。
  • std::unique_ptr被销毁时,它所指向的对象也会被自动删除。
  • 禁止复制构造和赋值操作,但支持移动语义。
#include <memory>  
#include <iostream>  class MyClass {  
public:  MyClass() { std::cout << "MyClass created\n"; }  ~MyClass() { std::cout << "MyClass destroyed\n"; }  void sayHello() { std::cout << "Hello!\n"; }  
};  int main() {  std::unique_ptr<MyClass> ptr(new MyClass());  ptr->sayHello();  // 当ptr离开作用域时,MyClass对象被自动删除  return 0;  
}

3.std::shared_ptr

  • 表示对对象的共享所有权,允许多个std::shared_ptr实例指向同一个对象。
  • 内部维护一个引用计数,用于记录当前有多少个std::shared_ptr实例指向该对象。
  • 当最后一个指向该对象的std::shared_ptr被销毁时,引用计数变为0,对象将被自动删除。
  • 支持复制构造和赋值操作,每次操作都会增加或减少引用计数。
#include <memory>  
#include <iostream>  class MyClass {  
public:  MyClass() { std::cout << "MyClass created\n"; }  ~MyClass() { std::cout << "MyClass destroyed\n"; }  void sayHello() { std::cout << "Hello!\n"; }  
};  int main() {  std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();  std::shared_ptr<MyClass> ptr2 = ptr1; // ptr2和ptr1共享对象  ptr1->sayHello();  // 当ptr1和ptr2都离开作用域时,MyClass对象被自动删除  return 0;  
}

4.std::weak_ptr

  • 是一种不拥有其所指对象的智能指针,主要用于解决std::shared_ptr之间的循环引用问题。
  • 不增加对象的引用计数,因此不会影响对象的生命周期。
  • 可以通过lock()成员函数尝试获取一个指向对象的std::shared_ptr,如果此时对象仍存在,则返回一个指向该对象的std::shared_ptr,否则返回一个空的std::shared_ptr
// 示例中省略了完整的类和对象定义,只展示weak_ptr的用途  
std::shared_ptr<A> ptrA = std::make_shared<A>();  
std::shared_ptr<B> ptrB = std::make_shared<B>();  ptrA->b_ptr = std::weak_ptr<B>(ptrB); // 使用weak_ptr避免循环引用  
ptrB->a_ptr = ptrA;  // ...  if (auto lockedPtr = ptrA->b_ptr.lock()) {  // 如果B对象还存在,lockedPtr将是一个非空的shared_ptr  
}
http://www.lryc.cn/news/443172.html

相关文章:

  • 常用工具推荐!分享7款AI论文修改软件工具网站
  • 怎么解除BitLocker对磁盘的加密?
  • 群晖使用Docker部署WPS Office并实现异地使用浏览器制作办公文档
  • Unity3d 以鼠标位置点为中心缩放视角(正交模式下)
  • Git清除某文件所有历史提交记录
  • jacoco生成单元测试覆盖率报告
  • 【CSS Tricks】如何做一个粒子效果的logo
  • 如何使用ssm实现基于Javaweb的网上花店系统的设计与实现
  • Elastic 的 OpenTelemetry PHP 发行版简介
  • TCP 和 UDP 协议的区别?
  • 【PHP】使用thinkphp5查询最大值时,把varchar类型字段转换成数字
  • Java 正则表达式详解
  • MySQL篇(窗口函数/公用表达式(CTE))(持续更新迭代)
  • Jira Cloud涨价5%-20%,钉钉项目Teambition成优选替代
  • Python语言基础教程(下)4.0
  • 【HTTP】构造HTTP请求和状态码
  • Delta Lake如何使用
  • 面试题 - parallelStream() 有什么缺点 - ForkJoinPool,它和传统的线程池(如 ThreadPoolExecutor)的区别
  • 切换淘宝最新镜像源npm详细讲解
  • STM32F407单片机编程入门(十二) FreeRTOS实时操作系统详解及实战含源码
  • 网络安全-利用 Apache Mod CGI
  • ACE之ACE_Reactor_Notify
  • 【小沐学GIS】blender导入OpenStreetMap城市建筑(blender-osm、blosm)
  • 数字IC设计\FPGA 职位经典笔试面试整理--语法篇 Verilog System Verilog(部分)
  • 【EtherCAT】CiA402简介
  • 嵌入式Linux:模块化编程
  • 【两方演化博弈代码复现】:双方演化博弈的原理、概率博弈仿真、相位图、单个参数灵敏度演化
  • Selenium打开浏览器后闪退问题解决
  • 【图论】最短路应用
  • Spring Boot实战:使用策略模式优化商品推荐系统