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

深入理解 C++11 智能指针:独占、共享与弱引用的完美管理

文章目录

  • std::unique_ptr(独占式智能指针)
  • std::shared_ptr(共享式智能指针)
  • std::weak_ptr(弱引用智能指针)
  • 示例展示:
  • 智能指针的原理
  • 内存泄漏
    • **什么是内存泄漏,内存泄漏的危害**
    • **如何检测内存泄漏**
    • **如何避免内存泄漏**
  • C++11和boost中智能指针的关系
  • unique_ptr自己实现
  • shared_ptr

  • C++标准库提供了三种主要类型的智能指针:

std::unique_ptr(独占式智能指针)

unique_ptr是最常用的一种智能指针,它确保一个指针在同一时刻只能有一个所有者。当unique_ptr超出作用域时,它所持有的资源会自动被销毁。

特点:

  • 不能被复制,只能被转移(通过std::move)。
  • 负责管理指向对象的生命周期,自动释放资源。
std::unique_ptr<int> ptr(new int(5));  // 创建unique_ptr并指向动态分配的内存
// 当ptr超出作用域时,内存会被自动释放

适用场景:

  • 用于表达资源的独占所有权,比如文件句柄、数据库连接等。

std::shared_ptr(共享式智能指针)

shared_ptr允许多个指针共享对同一个对象的所有权。当所有指向同一对象的shared_ptr都被销毁时,所管理的资源才会被释放。shared_ptr通过引用计数来管理对象的生命周期。

特点:

  • 支持多个shared_ptr实例共同拥有一个对象。
  • 引用计数:每当一个新的shared_ptr指向对象时,引用计数增加;当shared_ptr销毁时,引用计数减少;当引用计数为0时,资源被自动释放。
std::shared_ptr<int> ptr1 = std::make_shared<int>(10);  // 创建shared_ptr并初始化
std::shared_ptr<int> ptr2 = ptr1;  // 共享资源,引用计数为2

适用场景:

  • 用于需要多个所有者共享一个资源的场景,比如共享的数据结构、图形界面中多个组件共享同一数据等。
    在这里插入图片描述

std::weak_ptr(弱引用智能指针)

weak_ptr是与shared_ptr配合使用的智能指针,它不会增加引用计数,因此不会影响资源的生命周期。weak_ptr通常用于解决shared_ptr之间的循环引用问题。

特点:

  • 不增加引用计数,因此不会导致资源无法释放。
  • 可以通过 lock() 方法将其转换为shared_ptr,在获取资源之前,需要确保资源还存在。
std::weak_ptr<int> weakPtr = ptr1;  // 不增加引用计数
if (auto lockedPtr = weakPtr.lock()) 
{// 使用lockedPtr来访问资源
}

适用场景:

  • 用于观察者模式,避免循环引用。
  • 用于缓存系统,避免过度占用内存。
    在这里插入图片描述

智能指针类型概览

  • unique_ptr:独占所有权,不能拷贝只能移动

  • shared_ptr:共享所有权,基于引用计数

  • weak_ptr:配合 shared_ptr 使用,解决循环引用问题

  • auto_ptr(已废弃):C++98 的智能指针,不推荐使用

示例展示:

unique_ptr 示例(独占所有权)

#include <memory>
#include <iostream>class MyClass {
public:MyClass() { std::cout << "MyClass created\n"; }~MyClass() { std::cout << "MyClass destroyed\n"; }void greet() { std::cout << "Hello from MyClass!\n"; }
};int main() 
{// 创建 unique_ptrstd::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();// 转移所有权std::unique_ptr<MyClass> ptr2 = std::move(ptr1);if(ptr2) {ptr2->greet();  // 正常调用}if(!ptr1) {std::cout << "ptr1 is now empty\n";}// 自动释放内存,无需手动deletereturn 0;
}

shared_ptr 示例(共享所有权)

#include <memory>
#include <iostream>class Item 
{
public:Item() { std::cout << "Item created\n"; }~Item() { std::cout << "Item destroyed\n"; }
};int main() 
{// 创建共享指针std::shared_ptr<Item> ptr1 = std::make_shared<Item>();{std::shared_ptr<Item> ptr2 = ptr1;  // 引用计数变为2std::cout << "Use count: " << ptr2.use_count() << "\n";  // 输出2}  // 引用计数回到1std::cout << "Use count: " << ptr1.use_count() << "\n";  // 输出1// 离开作用域时引用计数归零,自动释放内存return 0;
}

weak_ptr 示例(解决循环引用)

#include <memory>
#include <iostream>class Node;class Parent 
{
public:std::shared_ptr<Node> child;~Parent() { std::cout << "Parent destroyed\n"; }
};class Node 
{
public:std::weak_ptr<Parent> parent;  // 使用 weak_ptr 避免循环引用~Node() { std::cout << "Node destroyed\n"; }
};int main() 
{auto parent = std::make_shared<Parent>();auto node = std::make_shared<Node>();parent->child = node;node->parent = parent;  // 不会增加引用计数// 离开作用域后对象都能正常销毁return 0;
}
  • 智能指针特点比较
特性unique_ptrshared_ptrweak_ptr
所有权独占共享
拷贝操作
移动操作
引用计数观察计数
线程安全控制块安全同shared
自定义删除器

智能指针的原理

智能指针的原理主要依赖于C++的RAII(资源获取即初始化)机制,它通过封装指针来管理资源(如内存、文件句柄等)的生命周期。智能指针在构造时获取资源,在析构时释放资源,确保在程序结束时自动清理,从而避免了内存泄漏和悬空指针等问题。

  1. 智能指针的基本原理
    智能指针是封装了裸指针的类,它管理着指向对象的生命周期。当智能指针超出作用域时,它会自动释放资源,防止忘记手动删除内存等问题。智能指针的实现通常依赖于以下几个核心概念:
  • 构造函数:在创建智能指针时,智能指针会初始化并持有一个裸指针,指向一个动态分配的资源。
  • 析构函数:当智能指针超出作用域时,析构函数会自动调用,释放资源(例如:delete)。
  • 拷贝控制:智能指针需要对资源的所有权进行管理,避免多个指针共享同一资源时出现的问题。拷贝构造函数、赋值运算符和移动构造函数会控制资源的所有权转移。
  1. 智能指针的内存管理原理
    智能指针通过管理内存的生命周期来避免内存泄漏。它们利用C++的构造和析构机制,当智能指针对象销毁时,自动调用析构函数,确保内存资源被正确释放。
  • unique_ptr:独占资源,不允许其他指针共享资源的所有权。当unique_ptr析构时,自动删除它所持有的资源。
  • shared_ptr:使用引用计数机制,当资源被多个shared_ptr共享时,资源在最后一个shared_ptr析构时才会被释放。
  • weak_ptr:通过不增加引用计数来避免循环引用问题,它是一个观察者,不负责资源的释放。

内存泄漏

什么是内存泄漏,内存泄漏的危害

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使⽤的内存,⼀般是忘记释放或者发⽣异常释放程序未能执⾏导致的。内存泄漏并不是指内存在物理上的消失,⽽是应⽤程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因⽽造成了内存的浪费。
内存泄漏的危害:普通程序运⾏⼀会就结束了出现内存泄漏问题也不⼤,进程正常结束,⻚表的映射关系解除,物理内存也可以释放。⻓期运⾏的程序出现内存泄漏,影响很⼤,如操作系统、后台服务、⻓时间运⾏的客⼾端等等,不断出现内存泄漏会导致可⽤内存不断变少,各种功能响应越来越慢,最终卡死。

int main(){// 申请⼀个1G未释放,这个程序多次运⾏也没啥危害 // 因为程序⻢上就结束,进程结束各种资源也就回收了char* ptr = new char[1024 * 1024 * 1024];cout << (void*)ptr << endl;return 0;}

如何检测内存泄漏

内存泄漏的本质
内存泄漏(Memory Leak)是指程序在动态分配内存后,失去了对该内存的控制权,导致无法释放,最终耗尽系统内存资源。

典型特征:

  • 程序运行时间越长,内存占用持续增长

  • 重复执行相同操作时内存消耗不断增加

  • 最终可能导致程序崩溃或系统变慢

高级检测手段

工具名称平台特点
Dr. Memory跨平台比 Valgrind 更快
Intel InspectorWindows提供图形化界面
LeakSanitizerLinux与 ASan 集成

如何避免内存泄漏

  • ⼯程前期良好的设计规范,养成良好的编码规范,申请的内存空间记着匹配的去释放。ps:这个理想状态。但是如果碰上异常时,就算注意释放了,还是可能会出问题。需要下⼀条智能指针来管理才有保证。

  • 尽量使⽤智能指针来管理资源,如果⾃⼰场景⽐较特殊,采⽤RAII思想⾃⼰造个轮⼦管理。

  • 定期使⽤内存泄漏⼯具检测,尤其是每次项⽬快上线前,不过有些⼯具不够靠谱,或者是收费。

  • 总结⼀下:内存泄漏⾮常常⻅,解决⽅案分为两种:1、事前预防型。如智能指针等。2、事后查错型。如泄漏检测⼯具。

C++11和boost中智能指针的关系

  • Boost库是为C++语⾔标准库提供扩展的⼀些C++程序库的总称,Boost社区建⽴的初衷之⼀就是为C++的标准化⼯作提供可供参考的实现,Boost社区的发起⼈Dawes本⼈就是C++标准委员会的成员之⼀。在Boost库的开发中,Boost社区也在这个⽅向上取得了丰硕的成果,C++11及之后的新语法和库有很多都是从Boost中来的。
  • C++98中产⽣了第⼀个智能指针auto_ptr。
  • C++boost给出了更实⽤的scoped_ptr/scoped_array和shared_ptr/shared_array和weak_ptr等
  • C++TR1,引⼊了shared_ptr等,不过注意的是TR1并不是标准版。
  • C++11,引⼊了unique_ptr和shared_ptr和weak_ptr。需要注意的是unique_ptr对应boost的scoped_ptr。并且这些智能指针的实现原理是参考boost中的实现的。

unique_ptr自己实现

#include <iostream>template <typename T>
class MyUniquePtr 
{
private:T* ptr;public:// 构造函数explicit MyUniquePtr(T* p = nullptr) : ptr(p) {}// 析构函数,自动释放资源~MyUniquePtr() {delete ptr;}// 移动构造函数MyUniquePtr(MyUniquePtr&& other) noexcept : ptr(other.ptr) {other.ptr = nullptr; // 转移所有权}// 移动赋值运算符MyUniquePtr& operator=(MyUniquePtr&& other) noexcept {if (this != &other) {delete ptr; // 释放当前资源ptr = other.ptr;other.ptr = nullptr; // 转移所有权}return *this;}// 禁用拷贝构造函数和拷贝赋值运算符MyUniquePtr(const MyUniquePtr&) = delete;MyUniquePtr& operator=(const MyUniquePtr&) = delete;// 解引用操作符T& operator*() const { return *ptr; }// 指针操作符T* operator->() const { return ptr; }// 获取裸指针T* get() const { return ptr; }
};class MyClass 
{
public:void show() {std::cout << "MyClass show method\n";}
};int main() 
{// 创建 MyUniquePtr,并自动释放资源MyUniquePtr<MyClass> ptr1(new MyClass());ptr1->show();// 使用移动语义MyUniquePtr<MyClass> ptr2 = std::move(ptr1);// ptr1 现在为空,ptr2 拥有 MyClass 的所有权if (!ptr1.get()) {std::cout << "ptr1 is null\n";}ptr2->show();return 0;
}

shared_ptr

#include <iostream>template <typename T>
class MySharedPtr 
{
private:T* ptr;int* ref_count;public:// 构造函数explicit MySharedPtr(T* p = nullptr) : ptr(p), ref_count(new int(1)) {}// 析构函数~MySharedPtr() {--(*ref_count);if (*ref_count == 0) {delete ptr;delete ref_count;}}// 拷贝构造函数MySharedPtr(const MySharedPtr& other) : ptr(other.ptr), ref_count(other.ref_count) {++(*ref_count);}// 拷贝赋值运算符MySharedPtr& operator=(const MySharedPtr& other) {if (this != &other) {// 先减少当前对象的引用计数--(*ref_count);if (*ref_count == 0) {delete ptr;delete ref_count;}// 赋新值ptr = other.ptr;ref_count = other.ref_count;++(*ref_count);}return *this;}// 解引用操作符T& operator*() const { return *ptr; }// 指针操作符T* operator->() const { return ptr; }// 获取裸指针T* get() const { return ptr; }// 获取引用计数int use_count() const { return *ref_count; }
};class MyClass 
{
public:void show() {std::cout << "MyClass show method\n";}
};int main() 
{// 创建 MySharedPtr,并自动管理引用计数MySharedPtr<MyClass> ptr1(new MyClass());std::cout << "Reference count: " << ptr1.use_count() << std::endl;{MySharedPtr<MyClass> ptr2 = ptr1;  // ptr2 共享 ptr1 的所有权std::cout << "Reference count: " << ptr1.use_count() << std::endl;ptr2->show();}// ptr2 离开作用域后,ptr1 的引用计数减一std::cout << "Reference count after ptr2 goes out of scope: " << ptr1.use_count() << std::endl;return 0;
}

相关文章:

深入理解 C++11 智能指针:独占、共享与弱引用的完美管理

文章目录 std::unique_ptr&#xff08;独占式智能指针&#xff09;std::shared_ptr&#xff08;共享式智能指针&#xff09;std::weak_ptr&#xff08;弱引用智能指针&#xff09;示例展示&#xff1a;智能指针的原理内存泄漏**什么是内存泄漏&#xff0c;内存泄漏的危害****如…...

1.2 编译器结构

编译器具有模块化的高层结构。还可以将模块化进一步细化。编译器可以看成多个阶段构成的流水线结构。 一种没有优化的编译器结构 更复杂的编译器结构...

文件操作助手

文件操作助手 在我们实现一个大型项目时&#xff0c;往往会有一个公共模块&#xff0c;这个公共模块是公用的&#xff0c;里面可能会包含文件操作助手、字符串操作助手、时间戳操作助手… 而我们今天就来实现一个文件操作助手&#xff0c;里面包含的功能有&#xff1a; 判断…...

线段树与扫描线 —— 详解算法思想及其C++实现

目录 一、线段树&#xff08;Segment Tree&#xff09; 基本概念 结构 操作 示例代码 二、扫描线&#xff08;Sweep Line&#xff09; 基本概念 应用场景 示例代码&#xff08;矩形面积并集&#xff09; 三、总结 一、线段树&#xff08;Segment Tree&#xff09; 基本…...

Leetcode 刷题笔记1 图论part04

leetcode 110 字符串接龙 def judge(s1, s2):count 0for i in range(len(s1)):if s1[i] ! s2[i]:count 1return count 1if __name__ __main__:n int(input())begin_str, end_str map(str, input().split())if begin_str end_str:print(0)exit()strlist []for _ in ran…...

快速入手:Nacos融合SpringCloud成为注册配置中心

快速入手&#xff1a;Nacos融合SpringCloud成为注册配置中心 前言安装Nacos项目搭建添加配置启动类添加注解运行项目服务调用RestTemplate 模式FeignClient 模式 前言 Spring Cloud是一系列框架的集合&#xff0c;提供了微服务架构下的各种解决方案&#xff0c;如服务治理、配…...

others-rustdesk远程

title: others-rustdesk远程 categories: Others tags: [others, 远程] date: 2025-03-19 10:19:34 comments: false mathjax: true toc: true others-rustdesk远程, 替代 todesk 的解决方案 前篇 官方 服务器 - https://rustdesk.com/docs/zh-cn/self-host/rustdesk-server-o…...

go:前后端分离

1.前端代码 新建一个前端文件夹&#xff0c;在该文件夹下新建一个.html文件&#xff0c;写入自己的html代码。 前端搞定。 2.后端代码 其核心是挂载路由接受前端传来的数据核心代码如下&#xff1a; func main() { // 服务运行提示 fmt.Println("go web server is runn…...

lodash 学习笔记/使用心得

lodash 学习笔记/使用心得 简单记一下 lodash 的一点学习笔记使用心得&#xff0c;最近也是打算清理一下所有的 dead code&#xff0c;然后发现我们用了好多的 lodash 方法。对比了之前的写法&#xff0c;重新看了一下官方文档&#xff0c;再自己重新动手写了点 util 之后发现…...

网络爬虫【爬虫库request】

我叫不三不四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲爬虫 Requests是Python的一个很实用的HTTP客户端库&#xff0c;完全满足如今网络爬虫的需求。与Urllib对比&#xff0c;Requests不仅具备Urllib的全部功能&#xff1b;在开发使用上&…...

AI日报 - 2025年3月24日

&#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | Lyra生物序列建模架构效率惊人 在100生物任务中达最优&#xff0c;推理速度提升高达12万倍 ▎&#x1f4bc; 商业动向 | OpenAI用户破4亿&#xff0c;Meta与Reliance探讨AI合作 生态扩展与全…...

Android平台毫秒级低延迟HTTP-FLV直播播放器技术探究与实现

一、前言 在移动互联网蓬勃发展的今天&#xff0c;视频播放功能已成为众多Android应用的核心特性之一。面对多样化的视频格式和传输协议&#xff0c;开发一款高效、稳定的视频播放器是许多开发者追求的目标。FLV&#xff08;Flash Video&#xff09;格式&#xff0c;尽管随着H…...

动态规划——混合背包问题

动态规划——混合背包问题 混合背包问题01背包与完全背包的混合&#xff1a;完全背包与多重背包的混合&#xff1a;三种背包混合混合背包OJ汇总 混合背包问题 将01背包、完全背包、多重背包混合起来的背包问题。也就是说&#xff0c;有的物品只可以取一次&#xff08;01背包&a…...

数据库操作练习

一.向heros表中新增一列信息&#xff0c;添加一些约束&#xff0c;并尝试查询一些信息 //向表中添加一列age信息 alter table heros add column age int;//id列添加主键约束&#xff0c;设置自增 alter table heros modify column id int auto_increment primary key;//name列…...

3.milvus索引-HNSW

索引作用 加速大型数据集上的查询。 向量字段&#xff0c;仅只能创建一个索引。 milvus支持的向量索引类型大部分使用 近似最近邻搜索算法。ANNS该算法的核心不局限于返回最准确的结果&#xff0c;而是仅搜索目标的邻居。ANNS通过在可接受的范围内牺牲准确性提高检索效率。 …...

算法基础——栈

一、栈的概念 栈是⼀种只允许在⼀端进⾏数据插⼊和删除操作的线性表。 进⾏数据插⼊或删除的⼀端称为栈顶&#xff0c;另⼀端称为栈底。不含元素的栈称为空栈。进栈就是往栈中放⼊元素&#xff0c;出栈就是将元素弹出栈顶。 二、栈的模拟实现 1. 创建 本质还是线性表&#…...

开发语言漫谈-groovy

groovy是一门脚本语言&#xff0c;在前期的脚本语言中简单介绍了下。现在再深入介绍下&#xff0c;因为它是本平台上选用的脚本语言。所谓脚本语言就是不用编译&#xff0c;直接执行。这种特色非常适合做嵌入编程&#xff0c;即编即用。我们知道平台后台的业务开发语言是Java&a…...

ArkUI-List组件

列表是一个复杂的容器&#xff0c;当列表项达到一定数量&#xff0c;使得列表内容超出其范围的时候&#xff0c;就会自动变为可以滚动。列表适合用来展现同类数据类型。 List组件支持使用&#xff0c;条件渲染&#xff0c;循环渲染&#xff0c;懒加载等渲染控制方式生成子组件…...

数据仓库的 DWD 分层架构:构建高效数据平台的基石

在数据驱动的时代&#xff0c;数据仓库&#xff08;Data Warehouse&#xff09;作为企业数据分析的核心基础设施&#xff0c;扮演着至关重要的角色。而数据仓库的分层设计&#xff0c;则是确保数据高效流转、提升数据质量、支持复杂分析的关键。本文将深入探讨数据仓库的 DWD 分…...

山东大学数据结构课程设计

题目&#xff1a;全国交通咨询模拟系统 问题描述 处于不同目的的旅客对交通工具有不同的要求。例如&#xff0c;因公出差的旅客希望在旅途中的时间尽可能地短&#xff0c;出门旅游的旅客则期望旅费尽可能省&#xff0c;而老年旅客则要求中转次数最少。编织一个全国城市间的交…...

动态规划-01背包

兜兜转转了半天&#xff0c;发现还是Carl写的好。 看过动态规划-基础的读者&#xff0c;大概都清楚。 动态规划是将大问题&#xff0c;分解成子问题。并将子问题的解储存下来&#xff0c;避免重复计算。 而背包问题&#xff0c;就是动态规划延申出来的一个大类。 而01背包&…...

【2025】基于node.js的中医药科普平台的设计与实现(源码、万字文档、图文修改、调试答疑)

项目完整功能以演示视频为准 基于Node.js的中医药科普平台的设计与实现功能结构图如下 课题背景 随着人们健康意识的提高&#xff0c;中医药作为传统医学的重要组成部分&#xff0c;越来越受到关注。然而&#xff0c;中医药知识专业性强&#xff0c;普通大众获取准确、全面的中…...

基于Flux模型的多模态可控图像生成工作流实践

一、技术框架与模型选型 当前图像生成领域对多模态控制与一致性保持的需求日益增强&#xff0c;本文将基于Black Forest Labs推出的Flux.1模型&#xff0c;结合ControlNet的循环一致性优化技术&#xff0c;构建一套融合Canny边缘检测与深度图&#xff08;Depth&#xff09;控制…...

缓存过期时间之逻辑过期

1. 物理不过期&#xff08;Physical Non-Expiration&#xff09; 定义&#xff1a;在Redis中不设置EXPIRE时间&#xff0c;缓存键永久存在&#xff08;除非主动删除或内存淘汰&#xff09;。目的&#xff1a;彻底规避因缓存自动过期导致的击穿&#xff08;单热点失效&#xff…...

JVM类加载过程详解

文章目录 前言1.加载2.链接验证文件格式验证元数据验证字节码验证符号引用验证 准备解析 3.初始化4.类卸载 前言 类从被加载到虚拟机内存中开始到卸载出内存为止&#xff0c;它的整个生命周期可以简单概括为 7 个阶段&#xff1a;加载&#xff08;Loading&#xff09;、验证&a…...

第三十二篇 深入解析Kimball维度建模:构建企业级数据仓库的完整框架

目录 一、维度建模设计原则深度剖析1.1 业务过程驱动设计1.2 星型模式VS雪花模式 二、维度建模五步法实战&#xff08;附完整案例&#xff09;2.1 业务需求映射2.2 模型详细设计2.3 缓慢变化维处理 三、高级建模技术解析3.1 渐变维度桥接表3.2 快照事实表设计 四、性能优化体系…...

WPF 布局中的共性尺寸组(Shared Size Group)

1. 什么是共性尺寸组&#xff1f; 在 WPF 的 Grid 布局中&#xff0c;SharedSizeGroup 允许多个 Grid 共享同一列或行的尺寸&#xff0c;即使它们属于不同的 Grid 也能保持大小一致。这样可以保证界面元素的对齐性&#xff0c;提高布局的一致性。 SharedSizeGroup 主要用于需…...

19 数码管的动态显示

1、八段数码管 八段数码管 是一个 “ 8 ” 字型数码管&#xff0c;分为八段&#xff0c;a b c d e f g dp&#xff0c;其中dp为小数点。每一段为一个发光二极管&#xff0c;这样的 8 段称为 段选信号 。 2、实验 1、实验目标&#xff1a;让六位数码管 从 0 开始记数&#xff0…...

pytorch 笔记:张量索引的维度扩展规则

1 基本原理 在PyTorch中&#xff0c;张量索引的维度扩展规则遵循以下原则&#xff1a; 索引操作的核心规则&#xff1a;​ 当使用索引数组访问张量时&#xff1a; 索引数组的每个元素对应选取原张量的一个子张量结果形状 索引数组形状 原张量剩余维度形状 这么说可能不清…...

课外活动:怎么理解可变成本?

可变成本深度解析 &#x1f9ee; 一、可变成本的本质 #mermaid-svg-qoqQaFxQBuZZfAD2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qoqQaFxQBuZZfAD2 .error-icon{fill:#552222;}#mermaid-svg-qoqQaFxQBuZZfAD2 …...

深入理解 JVM 的垃圾收集器:CMS、G1、ZGC

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

IDEA 快捷键ctrl+shift+f 无法全局搜索内容的问题及解决办法

本篇文章主要讲解IDEA、phpStrom、webStrom、pyCharm等jetbrains系列编辑器无法进行全局搜索内容问题的主要原因及解决办法。 日期&#xff1a;2025年3月22日 作者&#xff1a;任聪聪 现象描述&#xff1a; 1.按下ctrlshiftf 输入法转为了繁体。 2.快捷键ctrlshiftr 可以全局检…...

智慧高速,安全护航:视频监控平台助力高速公路高效运营

随着我国高速公路里程的不断增长&#xff0c;交通安全和运营效率面临着前所未有的挑战。传统的监控方式已难以满足现代化高速公路管理的需求&#xff0c;而监控视频平台的出现&#xff0c;则为高速公路的安全运营提供了强有力的技术支撑。高速公路视频监控联网解决方案 高速公路…...

括弧匹配检验(信息学奥赛一本通-1354)

【题目描述】 假设表达式中允许包含两种括号&#xff1a;圆括号和方括号&#xff0c;其嵌套的顺序随意&#xff0c;如&#xff08;&#xff3b; &#xff3d;&#xff08;&#xff09;&#xff09;或&#xff3b;&#xff08;&#xff3b; &#xff3d;&#xff3b; &#xff3…...

MacOS安装 nextcloud 的 Virtual File System

需求 在Mac上安装next cloud实现类似 OneDrive 那样&#xff0c;文件直接保存在服务器&#xff0c;需要再下载到本地。 方法 在 官网下载Download for desktop&#xff0c;注意要下对版本&#xff0c;千万别下 Mac OS默认的那个。 安装了登录在配置过程中千万不要设置任何同…...

【秣厉科技】LabVIEW工具包——OpenCV 教程(11):人脸检测与识别

文章目录 前言级联分类器FaceDetectorYNFaceRecognizerSF1. 特征提取2. 人脸对比3. 人脸身份识别&#xff08;最佳匹配法&#xff09; 总结 前言 需要下载安装OpenCV工具包的朋友&#xff0c;请前往 此处 &#xff1b;系统要求&#xff1a;Windows系统&#xff0c;LabVIEW>…...

C++-C++中的几种cast

文章目录 static_castPOD类型互转任意指针类型与void*互转基类继承类之间的互转具有目标类型转换函数的类/单参数的构造函数 dynamic_castreinterpret_cast static_cast 所谓static&#xff0c;意思是在编译期进行的转换&#xff0c;static_允许如下转换&#xff1a; POD类型…...

list的模拟实现和学习

1. list的介绍及使用 说白了就是带头循环双向循环链表 stl 的两大组件就是容器和算法 &#xff0c;他们两个之间是通过迭代器进行联系的 这三种算法函数 迭代器的种类 性质&#xff08;容器底层结构决定&#xff09; 单项&#xff1a; forward_list /哈希(unord…...

程序代码篇---Pyqt的密码界面

文章目录 前言一、代码二、代码解释2.1用户数据库定义2.2窗口初始化2.3认证逻辑2.5角色处理2.6错误处理优化2.7功能扩展说明2.7.1用户类型区分管理员普通用户其他用户 2.7.2安全增强建议 三、运行效果四、运行命令五、界面改进建议5.1密码显示5.2用户头像显示5.3输入框动画效果…...

设计模式的六大原则

设计模式的六大原则 1. 单一职责原则 (Single Responsibility Principle, SRP) 一个类应该只负责一项职责。 示例代码 // 不好的设计&#xff1a;一个类承担多个职责 typedef struct {void (*read_data)(void);void (*process_data)(void);void (*save_data)(void);void (*…...

【Linux】信号:信号保存和处理

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.阻塞信号信号集 02.捕捉信号sigaction可重入函数volatileSIGCHLD 01.阻塞信号 实际执行信号的处理动作称为信号递达&#xff1a;每个信号都有一个默认行为&#xff0c;例如终…...

Linux 线程概念

目录 一、什么是线程 1. 线程的本质 2. 线程的独有资源 3. 进程与线程关系示意图 二、线程的优缺点 2.1 线程的优点 2.2 线程的缺点 三、线程的异常与用途 1. 线程异常 2. 线程用途 四、进程 VS 线程 1. 核心差异 2. 进程的多个线程共享的资源 3. 进程和线程的关…...

红帽认证工程师价值

红帽认证工程师具有较高的价值&#xff0c;主要体现在以下几个方面&#xff1a; 行业认可度高 国际通用&#xff1a;红帽公司是全球领先的开源解决方案提供商&#xff0c;其认证在全球范围内被广泛认可。无论是在国内还是国外&#xff0c;拥有红帽认证工程师资格证书都能为个人…...

交换机远程登录

创建交换机 创建PC主机使用直通线连接交换机 配置交换机&#xff0c;使之能够与PC通信 双击交换机打开界面&#xff0c;选择CLI ">“表示用户模式 输入”?“查看可以使用的命令 “#” 特权模式&#xff0c;输入命令enable切换 输入”?“查看特权模式下可以使用…...

opencascade 源码学习 XmlDrivers-XmlDrivers

OpenCASCADE 中的 XmlDrivers 是用于处理 XML 格式的 CAD 数据持久化模块&#xff0c;属于 OCAF&#xff08;Open CASCADE Application Framework&#xff09; 的一部分。它允许将 OCAF 文档&#xff08;包含 CAD 数据、属性、关系等&#xff09;序列化为 XML 文件&#xff0c;…...

【Linux网络-五种IO模型与阻塞IO】

一、引入 网络通信的本质就是进程间的通信&#xff0c;进程间通信的本质就是IO&#xff08;Input&#xff0c;Output&#xff09; I/O&#xff08;input/output&#xff09;也就是输入和输出&#xff0c;在冯诺依曼体系结构当中&#xff0c;将数据从输入设备拷贝到内存就叫作…...

Redis、Memcached应用场景对比

环境 Redis官方网站&#xff1a; Redis - The Real-time Data Platform Redis社区版本下载地址&#xff1a;Install Redis | Docs Memcached官方网站&#xff1a;memcached - a distributed memory object caching system Memcached下载地址&#xff1a;memcached - a dis…...

Qt窗口控件之菜单栏QMenuBar

菜单栏QMenuBar 1. QMenuBar Qt 中的菜单栏是通过 QMenuBar 类型来实现的&#xff0c;一个主控件最多只能有一个菜单栏。一个菜单栏可以添加多个菜单&#xff0c;一个菜单又可以添加多个菜单项。 每个菜单又都是一个 QMenu 类型&#xff0c;每个菜单项都是一个 QAction。 2.…...

随想...启航

我要学算法 我要在蓝桥杯中拿奖 我要参加acm打牌&#xff0c; 我要参加百度之星&#xff0c;摘取那微弱的希望&#xff0c; 我要参加马蹄杯&#xff0c;看看曾经我的组长看过的风景。 所以我建立了算法专栏&#xff01; 为能贴近并指引组员 我建立了Java专栏 那一个星期&…...

2025.3.17-2025.3.23学习周报

目录 摘要Abstract1 文献阅读1.1 动态图邻接矩阵1.2 总体框架1.2.1 GCAM1.2.2 输出块 1.3 实验分析 总结 摘要 在本周阅读的文献中&#xff0c;作者提出了一种名为TFM-GCAM的模型。TFM-GCAM模型的创新主要分为两部分&#xff0c;一部分是交通流量矩阵的设计&#xff0c;TFM-GC…...