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

UE学习日志#25、26 C++笔记#11 智能指针

 注:本篇内容主要为《C++20高级编程》的学习笔记

         当智能指针离开作用域或被重置时,会自动释放所占用的资源。智能指针可用于管理在函数作用域内(或作为类的数据成员)动态分配的资源。也可以通过函数实参来传递动态分配的资源的所有权。

        1.可通过模板为任何指针类型编写类型安全的智能指针类

        2.可使用运算符重载为智能指针对象提供一个接口,使智能指针对象的使用和普通指针一样

1 unique_ptr

        unique_ptr拥有资源的唯一所有权。当unique_ptr被销毁或重置时,资源将自动释放。unique_ptr的一个优点是,内存和资源总会被释放,即使在执行return语句或抛出异常时也是如此。例如,当函数有多个返回语句时,这简化了编码,因为不必记住在每个return语句之前释放资源。
        作为经验法则,总是应该将动态分配的有唯一所有者的资源保存在unique_ptr的实例中。

1.1 创建 unique_ptr

        考虑下面的函数,这个函数在自由存储区上分配了一个 Simple 对象,但是不释放这个对象,故意产生内存泄漏。

void leaky(){Simple* mySimplePtr{ new Simple() };// BUG! 内存从未被释放!mySimplePtr->go();
}

        有时你可能认为,代码正确地释放了动态分配的内存。遗憾的是,这种想法几乎总是不正确的。看看下面的函数:

void couldBeLeaky(){Simple* mySimplePtr { new Simple{} };mySimplePtr->go();delete mySimplePtr;
}

        上面的函数动态分配一个 Simple 对象,使用该对象,然后正确地调用 delete。但是,这个例子仍然可能会产生内存泄漏!如果go方法抛出一个异常,将永远不会调用delete,导致内存泄漏。
        应该使用unique_ptr ,它可通过std:make_unique()辅助函数创建。unique_ptr 是一个泛型的智能指针,可以指向任何类型的内存。因此它是一个类模板,std:make_unique()是一个函数模板。两者都需要尖括号<>之间的模板参数,指定 unique_ptr需要指向的内存类型。
        下面的函数使用了 unique_ptr,而不是原始指针。Simple 对象不会显式释放,但 unique_ptr 实例离开作用域时(在函数的末尾,或者因为抛出了异常),就会在其析构函数中自动释放Simple 对象:

void notLeaky()
{auto mySimpleSmartPtr{ make_unique<Simple>() };mySimpleSmartPtr->go();
}

        如果Simple的构造需要参数,就把他们放在make_unique()调用的圆括号里

        C++20中引入的make_unique_for_overwrite()用于优化,基本类型不会初始化,而对象仍然默认构造。

        也可以通过构造函数创建:

unique_ptr<Simple> mySimpleSmartPtr{ new Simple() };

        但是也可能出现内存泄漏,所以应始终使用make_unique()创建unique_ptr.

1.2 使用 unique_ptr

        仍然可以通过*或->对智能指针解引用

mySimpleSmartPtr->go();
(*mySimpleSmartPtr).go();

        get()方法可以直接获取底层指针,可将指针传递给需要普通指针的函数:

void processData(Simple* simple){};
processData(mySimpleSmartPtr.get());

        reset(),可释放unique_ptr的底层指针,并根据需要将其改成另一个指针

mySimpleSmartPtr.reset();//释放资源并设为nullptr
mySimpleSmartPtr.reset(new Simple());//释放资源并设为一个新的Simple实例

        release()可断开于底层指针的连接,返回资源的底层指针,然后将智能指针设为nullptr,但因为智能指针失去对资源的所有权,需要在用完资源时释放资源。

Simple* simple{ mySimpleSmartPtr.release() };
delete simple;
simple = nullptr;

        std::move()工具函数可以用于显式移动unique_ptr的所有权(详细会补)

1.3 unique_ptr和C风格的数组

auto myVariableSizedArray { make_unique<int[]>(10) };
myVariableSizedArray[1] = 123;

1.4 自定义deleter

int* my_alloc(int value) { return new int { value }; }
void my_free(int *p){ delete p };int main()
{unique_ptr<int ,decltype(&my_free)> myIntSmartPtr { my_alloc(42),my_free };
} 

        这个特性很有用,因为还可以管理其他类型的资源而不仅是内存。例如,当unique_ptr离开作用域时,可自动关闭文件或网络套接字以及其他资源。

        decltype(&my_free)用于返回my_free()的函数指针类型。

2 shared_ptr

        有时,多个对象或代码段需要同一指针的副本。由于unique_ptr无法复制,因此不能用于此类情况。相反,std::shared_ptr是一个可复制的支持共享所有权的智能指针。但是,如果有多个 shared_ptr实例引用同一资源,它们如何知道何时实际释放资源?这可以通过所谓的引用计数来解决,这正是“引用计数的必要性”一节的主题。但首先,让我们看看如何构造和使用 shared_ptr。

2.1 创建并使用 shared_ptr

        shared_ptr 的用法与 unique_ptr 类似。要创建 shared_ptr,可使用 make_shared(),它比直接创建shared_ptr 更高效。例如:

auto mySimpleSmartPtr { make_shared<Simple> () };

        总是使用 make_shared()创建 shared_ptr.
        与unique_ptr一样,类模板参数推断也不适用于 shared_ptr,所以必须指定模板类型。

        与unique_ptr类似,make_shared()使用了值初始化。如果你不需要的话,可以使用C++20 的
make_shared_for _overwrite()实现默认初始化,与 make_unique_for_overwrite()用法类似。


        从C++17开始,shared_ptr 就可以像 unique_ptr 一样可用于存储动态分配的C风格数组的指针。另外,从C++20开始,你可以使用 make_shared()来做这件事,正如你可以使用 make_unique()一样。


        但是,尽管这是可能的,仍建议使用标准库容器而非C风格数组


        与 unique_ptr一样,shared_ptr 也支持 ged()和 reset()方法。唯一的区别在于,当调用 reset()时,仅在最后的 shared_ptr 销毁或重置时,才释放底层资源。注意,shared_ptr 不支持 release()。可使用use_count()方法检索共享同一资源的shared_ptr 实例数量。


        与unique_ptr 类似,默认情况下,当存储C风格数组时,shared_ptr 使用标准的new 和 delete 运算符或使用 new[]和 delete[]分配和释放内存,可更改此行为,如下所示:

// Implementation of malloc_int () as before.
shared_ptr<int> myIntSmartPtr { malloc_int(42), my_free };

        可以看到,不必将自定义 deleter 的类型指定为模板类型参数,这比 unique_ptr 的自定义 deleter更简便。

2.2 引用计数的重要性

        这里只看原书中我觉得重要的一句话:唯一安全得到多个指向同一内存的shared_ptr实例的方法是创建shared_ptr的副本

2.3 强制转换 share_ptr

        正如某种类型的原始指针可以转换为另一种类型的指针一样,存储某种类型的 shared_ptr也可以转换为另一种类型的 shared_ptr。当然,对什么类型可以强制转换为什么类型有限制,并非所有强制转换都有效。可用于强制转换 shared _ptr 的函数有 const_pointer_cast()、dynamic_pointer_cast()、static_pointer_cast()和 reinterpret_pointer_cast()。它们的行为和工作方式类似于非智能指针转换函数const_cast()、dynamic_cast()、static_cast()和 reinterpret_cast(),之后会详细讨论这些方法。

2.4 别名

        shared_ptr支持所谓的别名。这允许一个 shared_ptr 与另一个 shared_ptr 共享一个指针(拥有的指针),但指向不同的对象(存储的指针)。例如,这可用于使用一个 shared_ptr 拥有一个对象本身的同时,指向该对象的成员。例如:

class Foo
{public:Foo(int value): m_data { value }{}int m_data;
};auto foo{ make_shared<Foo>(42) };auto aliasing { shared_ptr<int> { foo, &foo->m_data } };

        仅当两个 shared_ptr(foo 和 aliasing)都销毁时,才销毁Foo 对象。
        “拥有的指针”用于引用计数,对指针解引用或调用它的get()时,将返回“存储的指针”。
        警告:
        在现代C++代码中,只有在没有涉及所有权时才允许使用原始指针!如果涉及所有权,默认情况下使用 unique_ptr;如果需要共享所有权,则使用 shared_ptr. 此外,使用 make_ unique() 和 make _shared()创建这些智能指针。这样,几乎不需要直接调用new 运算符,也不需要调用 delete.

3 weak_ptr

        在C++中还有一个类与 shared_ptr 有关,那就是 weak_ptr。weak_ptr 可包含由 shared_ptr 管理的资源的引用。week _ptr 不拥有这个资源,所以不能阻止shared_ptr 释放资源。weak_ptr 销毁时(例如离开作用域时)不会销毁它指向的资源,然而,它可用于判断资源是否已经被关联的 shared_ptr 释放了。week_ptr的构造函数要求将一个 shared_ptr 或另一个weak_ptr 作为参数。为了访问weak_ptr 中保存的指针,需要将 weak_ptr 转换为 shared_ptr。这有两种方法:

  • 使用weak_ptr 实例的lock()方法,这个方法返回一个 shared_ptr。如果同时释放了与weak_ptr关联的 shared_ptr,返回的 shared_ptr 是 nullptr。
  • 创建一个新的 shared_ptr 实例,将 weak_ptr作为shared_ptr 构造函数的参数。如果释放了与weak_ptr 关联的 shared_ptr,将抛出 std:bad_weak_ptr 异常。

下例演示了 weak_ptr 的用法:

import <iostream>;
#include<limits>
#include<format>
#include<compare>
import Employee;
using namespace std;class Simple {
public:int m_data{};
};void useResource(weak_ptr<Simple>& weakSimple)
{auto resource{ weakSimple.lock() };if (resource){cout << "Resource still alive." << endl;}else {cout << "Resource has been freed!" << endl;}
}int main()
{auto sharedSimple{ make_shared<Simple>() };weak_ptr<Simple> weakSimple{ sharedSimple };useResource(weakSimple);sharedSimple.reset();useResource(weakSimple);}

运行结果: 

4 向函数传递参数 

        仅当涉及所有权转移或所有权共享时,接受指针作为其参数之一的函数才应该接受智能指针。要共享shared_ptr的所有权,只需要接受按值传递的shared_ptr作为参数。类似地,要转移unique_ptr的所有权,只需要接受按值传递的unique_ptr作为参数。后者需要使用移动语义。

        如果既不涉及所有权转移也不涉及所有权的共享,那么函数应该简单地使用 non-const 的引用或 const 引用作为参数;或者如果nullptr是参数的有效值,则应该使用原始指针作为参数。拥有诸如 const shared_ptr<T>& 或 const unique_ptr<T>&的参数类型没有多大意义。

5 从函数中返回

        从函数中返回智能指针是高效的。例如:

unique_ptr<Simple> create()
{auto ptr { make_unique<Simple>() };return ptr;
}
int main()
{unique_ptr<Simple> mySmartPtr1 {create()};auto mySmartPtr2{create()};
}

6 enable_shared_from_this

        std::enable_shared_from_this 派生的类允许对象调用方法,以安全地返回指向自己的shared_ptr或weak_ptr。如果没有这个基类,返回有效的shared_ptr 或 weak_ptr 的一种方法是将 weak_ptr 作为成员添加到类中,并返回它的副本或返回由它构造的shared_ptr。 enable_shared_from_this 类给派生类添加了以下两个方法:

  • shared_from_this()--返回一个 shared_ptr,它共享对象的所有权。
  • weak_from_ this()--返回一个 weak_ptr,它跟踪对象的所有权。

        这是一项高级功能,此处不做详述,下面的代码简单演示了它的用法。shared_from_this()和weak_fom_this()都是 public 方法。但是,你可能会觉得 public 接口中的 fom_this 部分令人困惑,因此作为演示,下面的Foo 类定义了自己的方法 getPointer()。

import <iostream>;
#include<limits>
#include<format>
#include<compare>
import Employee;
using namespace std;class Foo : public enable_shared_from_this<Foo>
{public:shared_ptr<Foo> getPointer() {return shared_from_this();}
};int main()
{auto ptr1{ make_shared<Foo>() };auto ptr2{ ptr1->getPointer() };cout <<"ptr1 adress=="<< ptr1 << endl;cout <<"ptr2 adress=="<< ptr2 << endl; cout <<"ptr1.use_count()==" << ptr1.use_count() << endl;cout << "ptr2.use_count()==" << ptr2.use_count() << endl;
}

运行结果: 

        注意,仅当对象的指针已经存储在share_ptr时,才能使用对象上的 share_from_this()。否则,将会抛出 bad_weak_ptr异常。另外,调用weak_from_this()总是允许的,但当对象的指针还未存储在shared_ptr时,将会返回一个空的weak_ptr。

        不能直接return shared_ptr<Foo>(this);会导致双重释放。 

7 过时的auto_ptr,不要用

相关文章:

UE学习日志#25、26 C++笔记#11 智能指针

注&#xff1a;本篇内容主要为《C20高级编程》的学习笔记 当智能指针离开作用域或被重置时&#xff0c;会自动释放所占用的资源。智能指针可用于管理在函数作用域内&#xff08;或作为类的数据成员&#xff09;动态分配的资源。也可以通过函数实参来传递动态分配的资源的所有权…...

Spring AI -使用Spring快速开发ChatGPT应用

前言 Spring在Java生态中一直占据大半江山。最近我发现Spring社区推出了一个Spring AI项目&#xff0c;目前该项目还属于Spring实验性项目&#xff0c;但是我们可以通过该项目&#xff0c;可以非常快速的开发出GPT对话应用。 本篇文章将会对SpringAI进行简单的介绍和使用&#…...

windows通过网络向Ubuntu发送文件/目录

由于最近要使用树莓派进行一些代码练习&#xff0c;但是好多东西都在windows里或虚拟机上&#xff0c;就想将文件传输到树莓派上&#xff0c;但试了发现u盘不能简单传送&#xff0c;就在网络上找到了通过windows 的scp命令传送 前提是树莓派先开启ssh服务&#xff0c;且Window…...

大语言模型需要的可观测性数据的关联方式

可观测性数据的关联方式及其优缺点 随着现代分布式架构和微服务的普及&#xff0c;可观测性&#xff08;Observability&#xff09;已经成为确保系统健康、排查故障、优化性能的重要组成部分。有效的可观测性数据关联方式不仅能够帮助我们实时监控系统的运行状态&#xff0c;还…...

python连点器

要实现一个用于抖音点赞的鼠标连点工具&#xff0c;可以通过编程或现有软件实现。以下是两种常见方法&#xff08;但请注意&#xff1a;频繁自动化操作可能违反平台规则&#xff0c;需谨慎使用&#xff09;&#xff1a; 方法 1&#xff1a;使用现成工具&#xff08;如 AutoClic…...

Nginx部署Umi React前端项目标准配置

文章目录 概要前端Umi项目配置文件请求后端Api打包 后端项目Nginx配置配置文件 错误信息 概要 使用UmiJs开发的前端项目打包部署在Nginx&#xff0c;主要是Umi中项目的配置和Nginx的配置 前端Umi项目 基于"umijs/max": "^4.3.24", "react": &…...

Ubuntu20.4软件应用打不开

安装 snap-store&#xff1a; 确保 Snap 已安装&#xff1a; Snap 是一个包管理系统&#xff0c;需要先确保 snapd 已经安装。如果系统中没有安装&#xff0c;可以通过以下命令来安装 Snap&#xff1a; sudo apt update sudo apt install snapd安装 snap-store&#xff1a; 使…...

如何在Vscode中接入Deepseek

一、获取Deepseek APIKEY 首先&#xff0c;登录Deepseek官网的开放平台&#xff1a;DeepSeek 选择API开放平台&#xff0c;然后登录Deepseek后台。 点击左侧菜单栏“API keys”&#xff0c;并创建API key。 需要注意的是&#xff0c;生成API key复制保存到本地&#xff0c;丢失…...

apisix的real-ip插件使用说明

k8s集群入口一般都需要过负载均衡&#xff0c;然后再到apisix。 这时候如果后台业务需要获取客户端ip&#xff0c;可能拿到的是lb或者网关的内网ip。 这里一般要获取真实ip需要做几个处理。 1. 负载均衡上&#xff0c;一般支持配置获取真实ip参数&#xff0c;需要配置上。然…...

基于 Ollama+Docker+OpenWebUI 的本地化部署deepseek流程

搭建deepseek 安装Ollama Ollama官方下载地址 下载完成后双击打开Ollama进行安装,点击install 安装完成后系统会弹出下图提示代表安装成功并且已启动 验证安装 ollama -v安装完成后&#xff0c;cmd 打开命令行窗口&#xff0c;输入 “ollama -v” 测试&#xff0c;显示 olla…...

打家劫舍3

今天和打家讲一下打家劫舍3 题目&#xff1a; 题目链接&#xff1a;337. 打家劫舍 III - 力扣&#xff08;LeetCode&#xff09; 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为root。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“…...

第三个Qt开发实例:利用之前已经开发好的LED驱动在Qt生成的界面中控制LED2的亮和灭

前言 上一篇博文 https://blog.csdn.net/wenhao_ir/article/details/145459006 中&#xff0c;我们是直接利用GPIO子系统控制了LED2的亮和灭&#xff0c;这篇博文中我们利用之前写好的LED驱动程序在Qt的生成的界面中控制LED2的亮和灭。 之前已经在下面两篇博文中实现了LED驱动…...

归一化与伪彩:LabVIEW图像处理的区别

在LabVIEW的图像处理领域&#xff0c;归一化&#xff08;Normalization&#xff09;和伪彩&#xff08;Pseudo-coloring&#xff09;是两个不同的概念&#xff0c;虽然它们都涉及图像像素值的调整&#xff0c;但目的和实现方式截然不同。归一化用于调整像素值的范围&#xff0c…...

DeepSeek-V2 论文解读:混合专家架构的新突破

论文链接&#xff1a;DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model 目录 一、引言二、模型架构&#xff08;一&#xff09;多头部潜在注意力&#xff08;MLA&#xff09;&#xff1a;重塑推理效率&#xff08;二&#xff09;DeepSeekM…...

基于布谷鸟算法实现率定系数的starter

布谷鸟算法&#xff08;Cuckoo Search, CS&#xff09;是一种基于群体智能的优化算法&#xff0c;灵感来源于布谷鸟的繁殖行为以及宿主鸟发现外来蛋的概率。该算法由 Xin-She Yang 和 Suash Deb 在2009年提出。它结合了莱维飞行&#xff08;Lvy flight&#xff09;这一随机漫步…...

Java之自定义注解

介绍&#xff1a;在Java中&#xff0c;自定义注解是通过 interface 关键字定义的。注解是一种元数据&#xff0c;可以附加到类、方法、字段等代码元素上&#xff0c;用于提供额外的信息或配置。 1. 自定义注解的基本语法 使用 interface 关键字定义注解&#xff0c;注解中可以…...

SpringCloud面试题----Nacos和Eureka的区别

功能特性 服务发现 Nacos&#xff1a;支持基于 DNS 和 RPC 的服务发现&#xff0c;提供了更为灵活的服务发现机制&#xff0c;能满足不同场景下的服务发现需求。Eureka&#xff1a;主要基于 HTTP 的 RESTful 接口进行服务发现&#xff0c;客户端通过向 Eureka Server 发送 HT…...

prometheus配置大盘与告警

1、prometheus配置大盘 kube-prometheus-stack 定义 dashboard https://stackoverflow.com/questions/77271449/persist-grafana-dashboard-on-kube-prometheus-and-expose-itAlso to persist dashboards to outlive pod deletion follow the below steps: Create your cust…...

记录 | WPF创建和基本的页面布局

目录 前言一、创建新项目注意注意点1注意点2 解决方案名称和项目名称 二、布局2.1 Grid2.1.1 RowDefinitions 行分割2.1.2 Row & Column 行列定位区分 2.1.3 ColumnDefinitions 列分割 2.2 StackPanel2.2.1 Orientation 修改方向 三、模板水平布局【Grid中套StackPanel】中…...

git代理设置

在 Git 中&#xff0c;可以通过以下命令查看当前设置的代理配置&#xff1a; 查看 HTTP 代理 git config --get http.proxy查看 HTTPS 代理 git config --get https.proxy查看全局代理设置 如果你设置了全局代理&#xff0c;可以通过以下命令查看&#xff1a; git config …...

使用 Axios ——个人信息修改与提示框实现

目录 详细介绍&#xff1a;个人信息设置与修改页面实现 1. HTML 结构 2. CSS 样式 3. JavaScript 核心逻辑 a. 信息渲染与表单提交 b. 头像上传与预览 4. 功能详解 5. 总结 提示&#xff1a; 这段代码展示了如何创建一个简单的个人信息设置页面&#xff0c;包含用户个…...

(done) openMP学习 (Day11: 可怕的东西:内存模型,Atomics,Flush(Pairwise同步))

url: https://dazuozcy.github.io/posts/introdution-to-openmp-intel/#19-%E6%8A%80%E8%83%BD%E8%AE%AD%E7%BB%83%E9%93%BE%E8%A1%A8%E5%92%8Copenmp 这一节介绍了一些概念&#xff0c;包括 OpenMP 内存模型&#xff0c;串行一致性的概念&#xff0c;以及 Flush 操作&#xff…...

docker数据持久化的意义

Docker 数据持久化是指在 Docker 容器中保存的数据不会因为容器的停止、删除或重启而丢失。Docker 容器本身是临时性的&#xff0c;默认情况下&#xff0c;容器内的文件系统是临时的&#xff0c;容器停止或删除后&#xff0c;其中的数据也会随之丢失。为了确保重要数据&#xf…...

【漫话机器学习系列】084.偏差和方差的权衡(Bias-Variance Tradeoff)

偏差和方差的权衡&#xff08;Bias-Variance Tradeoff&#xff09; 1. 引言 在机器学习模型的训练过程中&#xff0c;我们常常面临一个重要的挑战&#xff1a;如何平衡 偏差&#xff08;Bias&#xff09; 和 方差&#xff08;Variance&#xff09;&#xff0c;以提升模型的泛…...

android的Compose 简介

Jetpack Compose 简介 Jetpack Compose 是 Android 官方推出的声明式 UI 工具包&#xff0c;用于替代传统 XML 布局&#xff0c;简化界面开发流程。它基于 Kotlin 语言&#xff0c;通过函数式编程实现高效、灵活的 UI 构建&#xff0c;支持实时预览和更直观的状态管理。 优势…...

git学习

报错504&#xff1a;代理有问题 查看代理&#xff1a; 法1 export | grep proxy 法2 env | grep xxx设置代理HTTPS_PROXY为空&#xff1a; export HTTPS_PROXY重进入git bash&#xff0c;HTTPS_PROXYxxx&#xff0c;又出现了 有效的办法 无效的办法&#xff1a; #取消htt…...

Spring Boot 对接深度求索接口实现知识问答功能

Spring Boot 对接深度求索接口实现知识问答功能 一、概述 本文将详细介绍如何使用 Spring Boot 对接深度求索&#xff08;DeepSeek&#xff09;接口&#xff0c;实现知识问答功能。深度求索是一个强大的自然语言处理平台&#xff0c;提供多种 API 接口&#xff0c;包括知识问…...

探索Scikit-learn:Python中的机器学习宝库

探索Scikit-learn&#xff1a;Python中的机器学习宝库 引言 在数据科学和机器学习的世界中&#xff0c;Python无疑是最受欢迎的编程语言之一。而在Python的众多机器学习库中&#xff0c;Scikit-learn无疑是最闪耀的明星之一。Scikit-learn是一个开源的Python库&#xff0c;它…...

活动预告 | Power Hour: Copilot 引领商业应用的未来

课程介绍 智能化时代&#xff0c;商业应用如何实现突破&#xff1f;微软全球副总裁 Charles Lamanna 将为您深度解析&#xff0c;剖析其中关键因素。 在本次线上研讨会中&#xff0c;Charles Lamanna 将分享他在增强商业运营方面的独到见解与实战策略&#xff0c;深度解读商业…...

MIT6.824 Lecture 2-RPC and Threads Lecture 3-GFS

Lecture 2-RPC and Threads Go语言在多线程、同步&#xff0c;还有很好用的RPC包 《Effective Go》 线程是实现并发的重要工具 在分布式系统里关注多线程的原因&#xff1a; I/O concurrencyParallelismConvenience Thread challenges 用锁解决race问题 Coordination channel…...

MariaDB *MaxScale*实现mysql8读写分离

1.MaxScale 是干什么的&#xff1f; MaxScale是maridb开发的一个mysql数据中间件&#xff0c;其配置简单&#xff0c;能够实现读写分离&#xff0c;并且可以根据主从状态实现写库的自动切换&#xff0c;对多个从服务器能实现负载均衡。 2.MaxScale 实验环境 中间件192.168.12…...

Linux之Http协议分析以及cookie和session

Linux之Http协议分析以及cookie和session 一.分析请求行与响应行1.1请求行1.1.1资源的URL路径1.1.2常见的方法1.2响应行 二.cookie和session2.1cookie2.2session 一.分析请求行与响应行 在我们简单了解了请求和响应的格式以及模拟实现了请求和响应后我们已经可以通过网页来访问…...

Python Pandas(5):Pandas Excel 文件操作

Pandas 提供了丰富的 Excel 文件操作功能&#xff0c;帮助我们方便地读取和写入 .xls 和 .xlsx 文件&#xff0c;支持多表单、索引、列选择等复杂操作&#xff0c;是数据分析中必备的工具。 操作方法说明读取 Excel 文件pd.read_excel()读取 Excel 文件&#xff0c;返回 DataF…...

iOS主要知识点梳理回顾-3-运行时

运行时&#xff08;runtime&#xff09; 运行时是OC的重要特性&#xff0c;也是OC动态性的根本支撑。动态&#xff0c;如果利用好了&#xff0c;扩展性就很强。当然了&#xff0c;OC的动态性只能算是一个一般水平。与swift、java这种强类型校验的语言相比&#xff0c;OC动态性很…...

[渗透测试]热门搜索引擎推荐— — shodan篇

[渗透测试]热门搜索引擎推荐— — shodan篇 免责声明&#xff1a;本文仅用于分享渗透测试工具&#xff0c;大家使用时&#xff0c;一定需要遵守相关法律法规。 除了shodan&#xff0c;还有很多其他热门的&#xff0c;比如&#xff1a;fofa、奇安信的鹰图、钟馗之眼等&#xff0…...

java-初识List

List&#xff1a; List 是一个接口&#xff0c;属于 java.util 包&#xff0c;用于表示有序的元素集合。List 允许存储重复元素&#xff0c;并且可以通过索引访问元素。它是 Java 集合框架&#xff08;Java Collections Framework&#xff09;的一部分 特点&#xff1a; 有序…...

ElasticSearch集群因索引关闭重打开导致飘红问题排查

背景 某组件向 ElasticSearch 写入数据&#xff0c;从最近某一天开始写入速度变慢&#xff0c;数据一直有积压。推测是 ElasticSearch 集群压力导致的&#xff0c;查看 ElasticSearch 集群状态&#xff0c;发现集群确实处于 red 状态。 本文记录 ElasticSearch 集群因索引关闭…...

idea 如何使用deepseek 保姆级教程

1.安装idea插件codegpt 2.注册deepseek并生成apikey deepseek 开发平台&#xff1a; DeepSeek​​​​​​​ 3.在idea进行codegpt配置 打开idea的File->Settings->Tools->CodeGPT->Providers->Custom OpenAI Chat Completions的URL填写 https://api.deepseek…...

【大模型】硅基流动对接DeepSeek使用详解

目录 一、前言 二、硅基流动介绍 2.1 硅基流动平台介绍 2.1.1 平台是做什么的 2.2 主要特点与功能 2.2.1 适用场景 三、硅基流动快速使用 3.1 账户注册 3.2 token获取 3.2.1 获取token技巧 四、Cherry-Studio对接DeepSeek 4.1 获取 Cherry-Studio 4.2 Cherry-Stud…...

机器学习数学基础:14.矩阵的公式

1. 操作顺序可交换 对于矩阵 A A A&#xff0c;若存在两种运算 ? ? ?和 ? ? ?&#xff0c;使得 ( A ? ) ? ( A ? ) ? (A^{?})^{?}\ (A^{?})^{?} (A?)? (A?)?&#xff0c;这意味着这两种运算的顺序可以交换。由此我们得到以下三个重要等式&#xff1a; ( A …...

t113-qt

修改QT配置: # # qmake configuration for building with arm-linux-gnueabi-g ## MAKEFILE_GENERATOR UNIX # CONFIG incremental # QMAKE_INCREMENTAL_STYLE sublib# include(../common/linux.conf) # include(../common/gcc-base-unix.conf) # inc…...

SQL自学,mysql从入门到精通 --- 第 14天,主键、外键的使用

1.主键 PRIMARY KEY 主键的使用 字段值不允许重复,且不允许赋NULL值 创建主键 root@mysqldb 10:11: [d1]> CREATE TABLE t3(-> name varchar(10) PRIMARY KEY,-> age int,-> class varchar(8)-> ); Query OK, 0 rows affected (0.01 sec)root@mysqldb 10:…...

整合 Redis 分布式锁:从数据结构到缓存问题解决方案

引言 在现代分布式系统中&#xff0c;Redis 作为高性能的键值存储系统&#xff0c;广泛应用于缓存、消息队列、实时计数器等多种场景。然而&#xff0c;在高并发和分布式环境下&#xff0c;如何有效地管理和控制资源访问成为一个关键问题。Redis 分布式锁正是为了解决这一问题…...

ASP.NET Core WebSocket、SignalR

目录 WebSocket SignalR SignalR的基本使用 WebSocket WebSocket基于TCP协议&#xff0c;支持二进制通信&#xff0c;双工通信。性能和并发能力更强。WebSocket独立于HTTP协议&#xff0c;不过我们一般仍然把WebSocket服务器端部署到Web服务器上&#xff0c;因为可以借助HT…...

array_walk. array_map. array_filter

1. array_walk 函数 array_walk 用于遍历数组并对每个元素执行回调函数。它不会受到数组内部指针位置的影响&#xff0c;会遍历整个数组。回调函数接收的前两个参数分别是元素的值和键名&#xff0c;如果有第三个参数&#xff0c;则数组所有的值都共用这个参数。 示例代码&am…...

解锁国内主流前端与后端框架

前端框架大揭秘 在当今的 Web 开发领域&#xff0c;前端框架的地位愈发举足轻重。随着用户对 Web 应用交互性和体验性要求的不断攀升&#xff0c;前端开发不再仅仅是简单的页面布局与样式设计&#xff0c;更需要构建复杂且高效的用户界面。前端框架就像是一位得力助手&#xf…...

Nginx进阶篇 - nginx多进程架构详解

文章目录 1. nginx的应用特点2. nginx多进程架构2.1 nginx多进程模型2.2 master进程的作用2.3 进程控制2.4 worker进程的作用2.5 worker进程处理请求的过程2.6 nginx处理网络事件 1. nginx的应用特点 Nginx是互联网企业使用最为广泛的轻量级高性能Web服务器&#xff0c;其特点是…...

【PDF提取内容】如何批量提取PDF里面的文字内容,把内容到处表格或者批量给PDF文件改名,基于C++的实现方案和步骤

以下分别介绍基于 C 批量提取 PDF 里文字内容并导出到表格&#xff0c;以及批量给 PDF 文件改名的实现方案、步骤和应用场景。 批量提取 PDF 文字内容并导出到表格 应用场景 文档数据整理&#xff1a;在处理大量学术论文、报告等 PDF 文档时&#xff0c;需要提取其中的关键信…...

HTML之CSS定位、浮动、盒子模型

HTML之CSS定位、浮动、盒子模型 定位 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…...

【Java基础】为什么不支持多重继承?方法重载和方法重写之间区别、Exception 和 Error 区别?

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;Java基础面经 &#x1f4da;本系列文章为个…...