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

server/2024/9/23 6:26:51/

智能指针

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.ppmy.cn/server/120115.html

相关文章

C#往压缩包Zip文件的文件追加数据

C#往压缩包Zip文件的文件追加数据 往一个已经压缩好的压缩包里追加数据,一般就有两种方式,一种是前面已经学习过的,就是追加一个新的文件, 另外一种就是往已经存在的文件追加数据。 往已经存在的文件追加数据,需要先找到文件索引。 在压缩包里声明的名称,与外面的文件路…

CompletableFuture的allOf一定不要乱用!血泪史复盘

文章目录 1. 到底遇到了什么问题&#xff1f;2. CountDownLatch搞起&#xff1f;3. allOf里面的坑4. 优化建议&#xff1a; 1. 到底遇到了什么问题&#xff1f; 最近看到组里面的同学遇到了这样的业务场景&#xff1a; 主线程需要异步并发调用多个接口&#xff0c;并且主线程…

主流卷积神经网络CNN总结

ResNet&#xff08;2015&#xff09;残差神经网络 残差结构 ResNet50具体卷积结构图 ResNeXt&#xff08;2016&#xff09;加入了分组卷积的思想&#xff0c;将原ResNet网络中的block替换成由group分组的block&#xff0c;两者得到的feature map一致&#xff0c;只是参数量更少…

Python语言基础教程(下)4.0

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

果蔬识别系统性能优化之路(五)

目录 前情提要剩下问题 解决方案新建storeFeature表实现ivf的动态增删改查 结语 前情提要 果蔬识别系统性能优化之路&#xff08;四&#xff09; 剩下问题 新建store_feature表&#xff0c;关联storeCode和featureId表&#xff0c;对数据库进行规范化&#xff0c;创建一个新…

Apache Airflow如何使用

Apache Airflow 是一个用于编排和调度任务的开源平台。它适用于创建、调度和监控数据工作流。以下是使用 Airflow 的基本步骤&#xff1a; 1. 安装 Apache Airflow 你可以通过以下命令来安装 Airflow&#xff1a; pip install apache-airflow建议使用虚拟环境来管理 Airflow…

ubuntu 执行定时任务crontab -e 无法输入的问题

界面显示 GNU nano 4.8 /tmp/crontab.l0A1HJ/crontab # Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined t…

一个基于 laravel 和 amis 开发的后台框架, 友好的组件使用体验,可轻松实现复杂页面(附源码)

前言 随着互联网应用的发展&#xff0c;后台管理系统的复杂度不断增加&#xff0c;对于开发者而言&#xff0c;既要系统的功能完备&#xff0c;又要追求开发效率的提升。然而&#xff0c;传统的开发方式往往会导致大量的重复劳动&#xff0c;尤其是在构建复杂的管理页面时。有…