c++ #include <memory> 智能指针介绍
#include <memory>
是 C++ 标准库中的头文件,用于支持智能指针的功能。智能指针是现代 C++ 的一种资源管理工具,用于自动管理动态分配的内存,从而减少内存泄漏和悬挂指针等问题的发生。它提供了多种类型的智能指针,包括 std::unique_ptr
、std::shared_ptr
和 std::weak_ptr
。
1. #include <memory>
#include
:预处理指令,用于在编译时包含指定的头文件。<memory>
:包含智能指针类的定义和相关功能。
2. 智能指针类型
-
std::unique_ptr
:- 功能:表示对某个动态分配对象的唯一所有权。它不能被复制,只能被移动。
- 使用场景:用于独占资源的场景,例如需要确保只有一个对象拥有资源。
- 示例:
#include <memory>int main() {std::unique_ptr<int> ptr1 = std::make_unique<int>(10);// std::unique_ptr<int> ptr2 = ptr1; // 错误:unique_ptr 不能被复制std::unique_ptr<int> ptr2 = std::move(ptr1); // 转移所有权return 0;
}
std::shared_ptr
:
- 功能:表示对某个动态分配对象的共享所有权。多个
shared_ptr
可以指向同一个对象,直到最后一个shared_ptr
被销毁时,资源才会被释放。 - 使用场景:用于多个对象需要共享对同一资源的所有权的场景。
- 示例:
#include <memory>
#include <iostream>int main() {std::shared_ptr<int> ptr1 = std::make_shared<int>(20);std::shared_ptr<int> ptr2 = ptr1; // 共享所有权std::cout << *ptr1 << ", " << *ptr2 << std::endl; // 输出:20, 20return 0;
}
std::weak_ptr
:
- 功能:与
std::shared_ptr
配合使用,用于解决共享所有权中的循环引用问题。weak_ptr
不会影响对象的引用计数,因此不会阻止对象的销毁。 - 使用场景:用于观察对象而不影响其生命周期。
- 示例
#include <memory>
#include <iostream>class Node {
public:std::shared_ptr<Node> next;
};int main() {std::shared_ptr<Node> first = std::make_shared<Node>();std::weak_ptr<Node> weakFirst = first; // 创建 weak_ptr 观察 firstif (auto sharedFirst = weakFirst.lock()) {std::cout << "Node is still alive" << std::endl;} else {std::cout << "Node has been destroyed" << std::endl;}return 0;
}
3.使用示例
#include <iostream>
#include <memory>int main() {// 使用 unique_ptrstd::unique_ptr<int> uniquePtr = std::make_unique<int>(100);std::cout << "UniquePtr value: " << *uniquePtr << std::endl;// 使用 shared_ptrstd::shared_ptr<int> sharedPtr1 = std::make_shared<int>(200);std::shared_ptr<int> sharedPtr2 = sharedPtr1;std::cout << "SharedPtr value: " << *sharedPtr1 << ", " << *sharedPtr2 << std::endl;// 使用 weak_ptrstd::weak_ptr<int> weakPtr = sharedPtr1;if (auto lockedPtr = weakPtr.lock()) {std::cout << "WeakPtr value: " << *lockedPtr << std::endl;} else {std::cout << "WeakPtr is expired" << std::endl;}return 0;
}
4. 优点
- 自动管理内存:智能指针自动管理动态内存,减少了内存泄漏和手动释放内存的需要。
- 安全性:智能指针避免了许多常见的内存管理错误,如悬挂指针和双重释放。
- 简洁性:提供了高效、易用的内存管理接口,使得代码更易于编写和维护。
使用 #include <memory>
可以有效地帮助管理动态内存,提升 C++ 程序的安全性和稳定性。
相关文章:
c++ #include <memory> 智能指针介绍
#include <memory> 是 C 标准库中的头文件,用于支持智能指针的功能。智能指针是现代 C 的一种资源管理工具,用于自动管理动态分配的内存,从而减少内存泄漏和悬挂指针等问题的发生。它提供了多种类型的智能指针,包括 std::un…...

32.递归、搜索、回溯之floodfill算法
0.简介 1.图像渲染 . - 力扣(LeetCode) 题目解析 算法原理 代码 class Solution {int[] dx { 0, 0, 1, -1 };int[] dy { 1, -1, 0, 0 };int m, n;int prev;public int[][] floodFill(int[][] image, int sr, int sc, int color) {if (image[sr][sc]…...
Vue3.5+ 响应式 Props 解构
你好同学,我是沐爸,欢迎点赞、收藏、评论和关注。 在 Vue 3.5 中,响应式 Props 解构已经稳定并默认启用。这意味着在 <script setup> 中从 defineProps 调用解构的变量现在是响应式的。这一改进大大简化了声明带有默认值的 props 的方…...
k8s中的认证授权
目录 一、kubernetes API 访问控制 1.1 UserAccount与ServiceAccount 1.1.1 ServiceAccount 1.1.2 ServiceAccount示例 二、认证(在k8s中建立认证用户) 2.1 创建UserAccount 2.2 RBAC(Role Based Access Control) 2.2.1 基于角色访问控制授权&…...
Leetcode 3291. Minimum Number of Valid Strings to Form Target I
Leetcode 3291. Minimum Number of Valid Strings to Form Target I 1. 解题思路2. 代码实现 题目链接:3291. Minimum Number of Valid Strings to Form Target I 1. 解题思路 这一题第一反应就是用一个字典树动态规划的方式,倒是也搞定了,…...
PostgreSQL的查看主从同步状态
PostgreSQL的查看主从同步状态 PostgreSQL 提供了一些系统视图和函数,查看和监控主从同步的状态。 1 在主节点上查看同步状态 pg_stat_replication 视图 在主节点上,可以通过查询 pg_stat_replication 视图来查看复制的详细状态信息,包括…...
Java多态性的理解
方法的覆盖 子类的方法重写了父类的方法,相当于对原来的方法进行了增强,接口就是这样的思想。 属性的隔离(Java中什么情况下都不会属性覆盖,python可能会覆盖) public class Main {public static void main(String[…...

安全工具 | 使用Burp Suite的10个小tips
Burp Suite 应用程序中有用功能的集合 img Burp Suite 是一款出色的分析工具,用于测试 Web 应用程序和系统的安全漏洞。它有很多很棒的功能可以在渗透测试中使用。您使用它的次数越多,您就越发现它的便利功能。 本文内容是我在测试期间学到并经常的主要…...
企业项目中字符串工具类
此工具类暂时包含如下功能: isEmpty()判断字符串是否为空subSpecifiedString()判断字符串是否超出指定长度,超出则截取到指定长度yearMonthToDate()将年月的字符串转成年月日格式 yearMonthToDateTime()将年月的字符串转成年月日时分秒格式 package co…...
下载github patch到本地
以下是几种从 GitHub 上下载以.patch 结尾的补丁文件的方法: 通过浏览器直接下载 打开包含该.patch 文件的 GitHub 仓库。在仓库的文件列表中找到对应的.patch 文件。点击该文件,浏览器会显示文件的内容,在页面的右上角通常会有一个“Raw”…...
C++基础部分代码
C OOP面对对象 this指针 C:各种各样的函数定义 struct C:类》实体的抽象类型 实体(属性,行为)-》ADT(abstract data type) OOP语言的四大特征是什么? 抽象 封装/隐藏 继承 多态 访问限定符:public公有的 private私有的…...

neo4j(spring) 使用示例
文章目录 前言一、neo4j是什么二、开始编码1. yml 配置2. crud 测试3. node relation 与java中对象的关系4. 编码测试 总结 前言 图数据库先驱者 neo4j:neo4j官网地址 可以选择桌面版安装等多种方式,我这里采用的是docker安装 直接执行docker安装命令: docker run…...

链接升级:Element UI <el-link> 的应用
链接升级:Element UI 的应用 一 . 创建文字链接1.1 注册路由1.2 创建文字链接 二 . 文字链接的属性2.1 文字链接的颜色2.2 是否显示下划线2.3 是否禁用状态2.4 填写跳转地址2.5 加入图标 在本篇文章中,我们将深入探索Element UI中的<el-link>组件—…...

简单题26 - 删除有序数组中的重复项(Java)20240917
问题描述: java代码: class Solution {public int removeDuplicates(int[] nums) {if (nums.length 0) return 0; // 处理空数组情况int i 0; // 指向新数组中的最后一个不重复元素for (int j 1; j < nums.length; j) {if (nums[j] ! nums[i]) { …...

DFS:深搜+回溯+剪枝实战解决OJ问题
✨✨✨学习的道路很枯燥,希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一 排列、子集问题 1.1 全排列I 1.2 子集I 1.3 找出所有子集的异或总和 1.4 全排列II 1.5 字母大小写全排列 1.6 优美的排列 二 组合问题 2.1 电话号码的数字组合 …...

命令语境中的“可以”的字词含义分析
摘要 在语言交流中,词汇的使用经常受到语境的影响。本文探讨了“可以”一词在上司与下属之间的互动中所表达的命令含义。通过分析语料和实例,发现“可以”在某些情况下并不传达许可的含义,而是被用作一种隐性命令。本文讨论了这一现象的成因…...
直播相关03-录制麦克风声音, ffmpeg 命名,使用命令行完成录音
一 ffmpeg 命令 ffmpeg arg1 arg2 -i arg3 arg4 arg5ffmpeg 全局参数 输入文件参数 -i 输入文件 输出文件参数 输出文件arg1:全局参数 arg2:输入文件参数 arg3:输入文件 arg4:输出文件参数 arg5:输出文件 二 ffprobe …...
VUE3中ref与reactive
ref:支持所有类型reactive:只支持引用类型(Obj,Array...)两者都是实现数据视图响应式 JS逻辑使用中 ref:需要使用.value reactive:不需要使用.value <el-button click"handle()" type"primary"…...

高职院校人工智能技术和无人机技术实训室建设方案
一、方案背景与需求分析 1.1 人工智能与无人机技术发展概况 人工智能(AI)和无人机技术作为当今科技领域的两大热点,正以前所未有的速度发展和渗透到各行各业中。根据国际数据公司(IDC)的报告,全球人工智能市场规模预计将在2024年…...

x-cmd pkg | shtris: 在终端体验经典的俄罗斯方块游戏
目录 简介首次用户技术特点竞品和相关项目进一步阅读 简介 shtris 是一个由 shell 脚本,参考 俄罗斯方块指南 (2009) 实现的俄罗斯方块游戏。 首次用户 本文的 demo 展现了如何通过 x-cmd 快速启动使用 shtris 。x-cmd也提供了1分钟教程可以帮你快速入门。 技术…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...