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

【C++指针】搭建起程序与内存深度交互的桥梁(下)

 

 

    🔥🔥 个人主页 点击🔥🔥


每文一诗  💪🏼

        往者不可谏,来者犹可追——《论语·微子篇》

        译文:过去的事情已经无法挽回,未来的岁月还可以迎头赶上。   


目录

C++内存模型

new与delete动态分配内存

动态分配单个变量(例如; int* ptr = new int(10))

动态分配数组(例如 int* arr = new int[5] )

分配内存失败的情况

一维数组与指针

使用数组名/和数组名加下标访问数组中元素及其地址

使用指针访问数组中元素及其地址

二维数组与指针

行指针

函数指针

指针用作函数参数

用函数指针来传递函数


 

C++内存模型

 

        栈区:由编译器自动管理,用于存储局部变量、函数参数和返回地址。每当调用一个函数时,会在栈上分配一块新的栈帧,函数执行完毕后,栈帧自动释放。

        堆区:也被叫做自由存储区,由程序员手动管理。通过new操作符在堆上分配内存,使用delete操作符释放内存。

        数据存储区:用于存放全局变量和静态变量。在程序启动时分配内存,程序结束时释放内存。

        代码区:用于存放程序的可执行代码。代码区是只读的,防止程序在运行过程中被意外修改。

栈区和堆区区别

  1. 管理方式不同:栈区是系统自动管理的,在离开作用域时,会自动释放
  2. 空间大小不同:栈区大小操作系统预先设定,一般只有8M。如果在栈上分配的内存超过了栈的最大容量,会导致栈溢出(Stack Overflow)错误;堆区空间仅受限与物理内存空间,所以相对较大。
  3. 效率不同:栈区内存的分配和释放速度非常快,因为它只需要移动栈指针;而堆区内存分配和释放需要操作系统复杂的操作。

new与delete动态分配内存

new:动态分配内存

delete:  释放分配的内存

在堆区动态分配内存的步骤:

  1. 声明一个指针
  2. 用new运算符向系统的堆区申请一块内存,并用指针指向这块内存
  3. 通过解引用的方式,来取出这块内存中的值
  4. 当这块内存不用时,需用delete来释放它

动态分配内存的两类:

动态分配单个变量(例如; int* ptr = new int(10))

    int* p = new int(2);std::cout<<"*p的值:"<<*p<<std::endl;//打印内存中的值delete p;

解析:

  • int* p = new int(2);

        首先在堆区new申请了一块内存,这块内存是int型,接着初始化该内存的值为2,最后返回新分配内存的地址,用一个int类型的指针来指向他。

  • delete p;

        释放这块内存

动态分配数组(例如 int* arr = new int[5] )

    int* arry = new int[8];for(int i=0;i<8;i++){*(arry+i) = i;std::cout<<"第"<<i<<"个值"<<*(arry+i)<<std::endl;}delete[] arry;

解析:

  • int* arry = new int[8];

        首先new申请了一块内存,这块内存存储的是一个含有8位int型数据的数组,最后返回新分配内存的地址,用一个int类型的指针来指向他。这里的arry代表数组的首地址。

  •  *(arry+i) = i;

        通过循环和解引用的方式为数组中每个数赋值。

  • delete[] arry;

        释放这块内存

分配内存失败的情况

        如果需要分配含有大量的数据的数组,那么栈空间上分配是远远不够的,需要在堆区分配。但是如果内存分配失败,则会导致程序崩溃,但是我们不希望这样,我们可以在内存分配失败的时候捕捉到这个错误。

使用std::nothrow

int main(int argc, char const *argv[])
{int* arry = new(std::nothrow)int[100000];if(arry == nullptr)std::cout<<"分配内存失败"<<std::endl;else{std::cout<<"分配内存成功"<<std::endl;arry[99999] = 0;delete[] arry;}return 0;
}

 

一维数组与指针

使用数组名/和数组名加下标访问数组中元素及其地址

int arry[3] = {2,4,6};
std::cout<<"数组"<<std::endl;
std::cout<<arry<<std::endl;
std::cout<<&arry[0]<<std::endl;
std::cout<<arry+1<<std::endl;
std::cout<<arry+2<<std::endl;
std::cout<<arry[0]<<std::endl;
std::cout<<arry[1]<<std::endl;
std::cout<<arry[2]<<std::endl;

解析:

  • 数组的名称/数组第一个元素的地址 是同一个地址
  • 数组名+n:数组第n个元素的地址
  • 数组名[n]:数组第n个元素的内容

使用指针访问数组中元素及其地址

int* p = arry;
std::cout<<"指针"<<std::endl;
std::cout<<p<<std::endl;
std::cout<<p+1<<std::endl;
std::cout<<p+2<<std::endl;
std::cout<<*(p)<<std::endl;
std::cout<<*(p+1)<<std::endl;
std::cout<<*(p+2)<<std::endl;

解析:

        如果将数组名称赋给一个指针变量,实际上是将数组的首地址赋给了指针。

  • 指针+n:数组第n个元素的地址
  • *(指针+n):数组第n个元素的内容

对于C++而言

数组名[下标] 解释为 *(数组名首地址+下标)

地址[下标] 解释为 *(地址+下标)

输出

两者是一样的

二维数组与指针

在讲二维数组之前,有必要去介绍对一个一维数组名取地址

void func2()
{int a[3] = {6,7,8};std::cout<<"数组第一个元素的地址:"<<a<<std::endl;std::cout<<"数组第一个元素的地址+1:"<<a+1<<std::endl;std::cout<<"数组的地址:"<<&a<<std::endl;//即为地址的地址,是一个行指针std::cout<<"数组的地址+1:"<<&a+1<<std::endl;int (*p)[3] = &a;//正确// int *p2 = &a;//错误S
}

解析:

       我们都知道数组名a是代表数组第一个元素的地址,但是&a是数组的地址,虽然a和&a的地址是相同的,但是二者有着不同的类型。

        a的类型是 int*

        &a的类型是 int(*p)[],即行指针。

为了证明a和&a有着不同的含义,我们同时对两个地址加1测试

输出

  •  可见数组第一个元素的地址+1后,实际上是加了4,对于16进制,c后是d,e,f,0然后进位a变为b,所以是ac变b0
  • 而数组的地址+1后,发现并没有+4,而是+12,12是3*4得来的,因为数组有3个int型数据,每个数据占4个字节。
  • 这也是行指针的作用,行指针+1后,实际上加上的是这一行数组组成的数组的总长度。

行指针

对于二维数组而言。

行指针格式: 数据类型 (*p)[列大小]

例如

int arry[2][3] = {{1,2,3},{4,5,6}};

int (*p)[3] = arry;

#include<iostream>int main(int argc, char const *argv[])
{int arry[2][3] = {{1,2,3},{4,5,6}};int (*p)[3] = arry;// 这种方式是一个行指针,也就是说该指针p指向的是二维数组中第一个包含三个int型数据的数组的地址// 对该地址进行解引用,就会得到该数组的首地址,再次解引用就会得到数组中具体的值。std::cout<<**p<<std::endl;//p为二维数组中每一行数组的地址,*p得到数组第一个元素的地址,**p得到数组元素的值std::cout<<*(*(p+1))<<std::endl;//p为二维数组中第0行数组的地址,再加1得到第1行数组的地址,解引用为第一行数组的第一个元素的地址,再解引用位第一个元素的值。std::cout<<*(*(p+1)+1)<<std::endl;//*(p+1)为第一行数组的第一个元素的地址,*(p+1)+1:再加1为第一行数组的第二个元素的地址,再解引用为第二个元素的值。std::cout<<*(p[1]+1)<<std::endl;//p[1]在c++中被解释为*(p+1)// 个人理解:// 地址 + n:// 应看这个地址的类型,即这个指针的类型,如果这个指针是行指针,那么加1就是加上这一行数组的总共的字节数//例如p+1,p是行指针,存储的是每一行数组的地址,加1其实是加上了4*3=12个字节//如果这个指针是普通指针,那么加1就是加上这个数组的单个元素的字节数//例如*(p+1)+1,*(p+1)是普通指针,存储的是数组第一个元素的地址,加1其实是加上了4个字节return 0;
}

输出

函数详解:

  • int (*p)[3] = arry;

        这种方式是一个行指针,也就是说该指针p指向的是二维数组中第一个包含三个int型数据的数组的地址

  • std::cout<<**p<<std::endl;

        p为二维数组中每一行数组的地址,*p得到数组第一个元素的地址,**p得到数组元素的值

  • std::cout<<*(*(p+1))<<std::endl;

        p为二维数组中第0行数组的地址,再加1得到第1行数组的地址,解引用为第一行数组的第一个元素的地址,再解引用位第一个元素的值。

  • std::cout<<*(*(p+1)+1)<<std::endl;

        *(p+1)为第一行数组的第一个元素的地址,*(p+1)+1:再加1为第一行数组的第二个元素的地址,再解引用为第二个元素的值。

  • std::cout<<*(p[1]+1)<<std::endl;

        p[1]在c++中被解释为*(p+1)

个人理解:

对于 地址 + n:

  •  应看这个地址的类型,即这个指针的类型,如果这个指针是行指针,那么加1就是加上这一行数组的总共的字节数。例如p+1,p是行指针,存储的是每一行数组的地址,加1其实是加上了4*3=12个字节
  • 如果这个指针是普通指针,那么加1就是加上这个数组的单个元素的字节数。例如*(p+1)+1,*(p+1)是普通指针,存储的是数组第一个元素的地址,加1其实是加上了4个字节

函数指针

指针用作函数参数

如果参数是一个 数组的话,必须传递数组的长度

下面用代码解释原因

#include<iostream>
void func(int* arr)
{std::cout<<"数组长度2="<<sizeof(arr)<<std::endl;for(int i =0;i<sizeof(arr)/sizeof(int);i++){std::cout<<*(arr+i)<<std::endl;}}
int main(int argc, char const *argv[])
{int arry[3] = {2,4,6};func(arry);std::cout<<"数组长度1="<<sizeof(arry)<<std::endl;  return 0;
}

输出

        在函数func中,参数是一个指针变量,使用sizeof运算符的时候,会返回这个指针的大小,而指针的大小是一个常数8(在64位操作系统);而在main函数中,arry是一个数组名,在使用sizeof运算符的时候,会返回这个数组的大小。

        所以在func函数中,sizeof(arr)/sizeof(int)的值是8/4等于2,所以数组只打印了索引为0和1的值。

正确的做法是参数中加上数组长度

#include<iostream>
void func(int* arr,int len)
{std::cout<<"数组长度2="<<sizeof(arr)<<std::endl;for(int i =0;i<len;i++){std::cout<<*(arr+i)<<std::endl;}}
int main(int argc, char const *argv[])
{int arry[3] = {2,4,6};func(arry,sizeof(arry)/sizeof(int));std::cout<<"数组长度1="<<sizeof(arry)<<std::endl;  return 0;
}

输出

用函数指针来传递函数

用途:可以用一个函数来调用别的函数.

做法:将该函数的参数设置为要调用函数的指针

声明一个函数指针:

格式:返回值类型 (*函数指针名)(参数1,参数2)

通过函数指针调用函数

函数指针名(参数1,2)

在C++中,函数的名称就是函数的地址

#include<iostream>int func2(int m)
{std::cout<<"函数2"<<std::endl;return m+1;
}
int func3(int m)
{std::cout<<"函数3"<<std::endl;return m-1;
}
void func(int(*pf)(int))
{std::cout<<"准备工作"<<std::endl;int n = pf(3);std::cout<<"返回值"<<n<<std::endl;std::cout<<"收尾工作"<<std::endl;
}
int main(int argc, char const *argv[])
{func(func2);func(func3);return 0;
}

函数解析:

这段代码实现了函数传递函数,通过修改参数可以让不同的函数被执行。  

     主要看的是void func(int(*pf)(int))

这个函数func的参数是一个函数指针

  • 名称:pf
  • 返回值:int
  • 参数:int 可不加变量名

    func(func2);func(func3);

这个是将需要传递的函数的名称传递过去,函数的名称就是函数的地址

 输出

若本文对你有帮助,你的支持是我创作莫大的动力!

    🔥🔥 个人主页 点击🔥🔥

 

相关文章:

【C++指针】搭建起程序与内存深度交互的桥梁(下)

&#x1f525;&#x1f525; 个人主页 点击&#x1f525;&#x1f525; 每文一诗 &#x1f4aa;&#x1f3fc; 往者不可谏&#xff0c;来者犹可追——《论语微子篇》 译文&#xff1a;过去的事情已经无法挽回&#xff0c;未来的岁月还可以迎头赶上。 目录 C内存模型 new与…...

ElasticSearch常用优化点

关闭交换分区&#xff1a;因为Linux采用了三级页表虚存管理&#xff0c;关闭交换分区可以减少系统IO&#xff0c;页面换入唤出时所耗费的总线时间以及减少系统中断次数&#xff1b;swap的使用会显著增加延迟和降低吞吐量。文件描述符配置&#xff1a;任何网络应用都需要增加文件…...

数据结构每日一题day3(顺序表)★★★★★

题目描述&#xff1a;顺序表L的元素递增有序排列&#xff0c;设计一个算法在插入元素x后保持该顺序表仍然递增有序排列,插入成功后返回插入元素所在位置,不成功返回-1 算法思想&#xff1a;在递增有序的顺序表中插入元素 x 并保持有序性&#xff0c;步骤如下&#xff1a; 合法…...

VS Code 中 .history`文件的来源与 .gitignore`的正确使用

引言 在使用 VS Code 进行 Git 版本控制时&#xff0c;有时会发现项目中多出一个 .history 目录&#xff0c;并被 Git 识别为未跟踪文件。本文将解释 .history 的来源&#xff0c;并提供 .gitignore 的正确配置方法&#xff0c;确保开发环境的整洁性。 1. .history 文件的来源…...

2025-03-26 学习记录--C/C++-PTA 6-3 求链式表的表长

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 6-3 求链式表的表长 本题要求实现一个函数&#xff0c;求链式表的表长。 函数接口定义&#xff1a; &…...

element-plus中Cascader级联选择器组件的使用

目录 一.基本使用 二.进阶使用 1.如何获取最后一级选项的值&#xff1f; 2.如何让级联选择器的输入框只展示最后一级&#xff1f; 三.实战 1.场景描述 2.实现步骤 ①设计后端返回值Vo ②编写controller ③编写service ④编写mapper层 ⑤在前端&#xff0c;通过发送…...

性能测试、负载测试、压力测试的全面解析

在软件测试领域&#xff0c;性能测试、负载测试和压力测试是评估系统稳定性和可靠性的关键手段。​它们各自关注不同的测试目标和应用场景&#xff0c;理解这些差异对于制定有效的测试策略至关重要。 本文对性能测试、负载测试和压力测试进行深入分析&#xff0c;探讨其定义、…...

阶段一:Java基础语法

目标&#xff1a;掌握Java的基本语法&#xff0c;理解变量、数据类型、运算符、控制结构等。 1. Java开发环境搭建 安装JDK配置环境变量编写第一个Java程序 代码示例&#xff1a; // HelloWorld.java public class HelloWorld { // 定义类名为 HelloWorldpublic static vo…...

信息安全的数学本质与工程实践

信息安全的本质是数学理论与工程实践的高度统一。在这个数字空间与物理世界深度融合的时代&#xff0c;信息安全已从简单的数据保护演变为维系数字社会正常运转的基础设施。对于计算机专业学习者而言&#xff0c;理解信息安全需要超越工具化认知&#xff0c;深入其数学内核与系…...

GPU架构与通信互联技术介绍

文章目录 GPU架构介绍SM 和 Warp Scheduler GPU通信互联技术介绍1、GPUDirectGPUDirect Shared AccessGPUDirect P2PGPUDirect for VideoGPUDirect for RDMARDMAGPUDirect RDMA GPUDirect Storage 2、NVLink & NVSwitchNVLinkNVSwitch 3、应用场景总结 GPU架构介绍 SM 和 …...

解决Centos使用yum命令报错“Cannot find a valid baseurl for repo: base/7/x86_64”问题

一、问题描述 我们在使用Centos7.9使用【sudo yum install influxdb2】命令安装influxDB数据库的时候提示“Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org/release=7&arch=x86_64&repo=os&infra=stock …...

CosyVoice2在Windows系统上本地部署的详细步骤

CosyVoice2在Windows系统上本地部署的详细步骤&#xff1a; 下载源码并初始化&#xff1a; 确保你的设备上安装了Git。打开命令提示符&#xff08;cmd&#xff09;&#xff0c;执行以下命令来克隆仓库&#xff1a;git clone --recursive https://github.com/FunAudioLLM/CosyVo…...

【拒绝算法PUA】LeetCode 2255. 统计是给定字符串前缀的字符串数目

目录 系列文章目录 专题总结&#xff1a; C刷题技巧总结&#xff1a; 题目 2116. 判断一个括号字符串是否有效 难度 描述 解题方法1 系列文章目录 专题总结&#xff1a; 【拒绝算法PUA】0x00-位运算【拒绝算法PUA】0x01- 区间比较技巧【拒绝算法PUA】0x02- 区间合并技…...

华为HCIE鸿蒙应用开发认证靠谱吗?

在万物互联时代&#xff0c;智能终端设备的多样性与协同需求催生了操作系统的革新。华为HarmonyOS&#xff08;鸿蒙系统&#xff09;凭借其分布式架构与全场景能力&#xff0c;正成为打破设备边界、重塑用户体验的核心技术底座。HCIE鸿蒙应用开发认证作为华为认证体系的顶级资质…...

AWE 2025:当AI科技遇见智能家居

3月20日&#xff0c;以“AI科技、AI生活”为主题的AWE2025&#xff08;中国家电及消费电子博览会&#xff09;在上海新国际博览中心开幕。作为全球家电行业风向标&#xff0c;本届展会最大的亮点莫过于健康理念在家电领域的全面渗透。从食材保鲜到空气净化&#xff0c;从衣物清…...

CSS选择器

文章目录 基本选择器复合选择器交集选择器并集选择器后代选择器子代选择器兄弟选择器相邻兄弟选择器通用兄弟选择器 属性选择器伪类选择器动态伪类结构伪类:first-child:last-child:nth-child:nth-last-child:first-of-type:last-of-type:nth-of-type:nth-last-of-type:only-ch…...

吐血整理:Air8201如何使用LuatOS进行电源管理功能!

在物联网应用场景中&#xff0c;设备续航能力直接影响其部署成本与运维效率。LuatOS操作系统通过软件层面的精细化控制&#xff0c;为Air8201提供了灵活且高效的电源管理策略。本文将从系统架构、API接口、实战配置三个维度&#xff0c;解析如何利用LuatOS实现Air8201的智能电源…...

C++11QT复习 (四)

Day6-1 输入输出流运算符重载&#xff08;2025.03.25&#xff09; 1. 拷贝构造函数的调用时机 2. 友元2.1 友元函数 3. 输入输出流运算符重载3.1 关键知识点3.2 代码3.3 关键问题3.4 完整代码 4. 下标访问运算符 operator[]4.1 关键知识点4.2 代码 5. 函数调用运算符 operator…...

Allure 报告数据存储结构

Allure 报告数据存储结构 Allure的报告的下有一个data目录&#xff0c;里面存储了全部展示的数据。data目录下面有两种类型的文件一类是csv&#xff0c;一类是json&#xff0c;两个类型的文件中同名的文件数据是一样的&#xff0c;只是不同的展示方法。我们就按照json格式的数据…...

HarmonyOS:基于axios实现文件的下载以及下载进度的监听

#前言&#xff1a;项目开发中&#xff0c;避免不了实现文件下载功能&#xff0c;其他平台的下载都很成熟&#xff0c;网上的例子也比较多&#xff0c;我就自己项目中实现的下载功能做个总结&#xff0c;你可以参考我的写法实现功能。 下载封装基于axios实现的下载功能。 1.下载…...

应用服务接口第二次请求一直pending问题

目录 一、问题背景二、问题排查过程三、解决方案四、总结 一、问题背景 升级内容发布到灰度环境&#xff0c;验证相关服务&#xff0c;查看接口调用日志&#xff0c;发现第一次请求正常&#xff0c;第二次相同接口请求就一直pending&#xff0c;其他服务也是如此 二、问题排查…...

外设的中断控制

如ADC、SPI、I2C、TIM等使用STM32 HAL库时的中断函数调用方式和UART非常类似&#xff0c;都有底层直接使能中断和上层库函数管理两种方式。下面详细说明几种典型外设&#xff1a; 一、ADC外设 &#xff08;1&#xff09;直接使能中断&#xff08;底层控制&#xff09;&#xf…...

云资源开发学习应用场景指南,场景 1 云上编程实践平台

云资源开发学习应用场景指南 云资源开发学习应用场景指南&#xff0c;场景 2&#xff1a;云桌面实验室 云资源开发学习应用场景指南&#xff0c;场景 3&#xff1a;云资源支持的项目实践 场景 1&#xff1a;云上编程实践平台 《如何在云平台上搭建你的第一个编程实践环境》…...

C++中使用CopyFromRecordset将记录集拷贝到excel中时,如果记录集为0个,函数崩溃,是什么原因

文章目录 原因分析解决方案1. 检查记录集是否为空2. 安全调用COM方法3.进行异常捕获4. 替代方案&#xff1a;手动处理空数据 总结 在C中使用CopyFromRecordset将空记录集&#xff08;0条记录&#xff09;复制到Excel时崩溃的原因及解决方法如下&#xff1a; 原因分析 空记录集…...

第四届能源、电力与电气国际学术会议(ICEPET 2025)

重要信息 地点&#xff1a;中国-成都 官网&#xff1a;www.icepet.net&#xff08;了解参会投稿等信息&#xff09; 时间&#xff1a;2025年4月25-27日 简介 第四届能源、电力与电气会&#xff08;ICEPET 2025定于2025年4月25-27日在中国成都举办。 本次将围绕能源、电力及…...

【IDEA的个性化配置】

目录&#xff1a; 一&#xff1a;隐藏项目路径二&#xff1a;禁用斜体注释三&#xff1a;重新Maven构建未完待续... 一&#xff1a;隐藏项目路径 &#x1f60a;在IDEA左侧的Project目录中&#xff0c;项目名称后面显示了项目的文件路径地址&#xff0c;如果不喜欢可以隐藏&…...

分享最近前端面试遇到的一些问题

前情提要&#xff08;分享个人情况&#xff0c;可以直接跳过&#xff09; 先说一下我的个人情况&#xff0c;我是2026届的&#xff0c;目前是在找前端实习。 3月初&#xff0c;从3月3日开始在Boss上投简历。 分享我的个人故事&#xff0c;不想看可以直接滑到下面&#xff0c;…...

SSH免密登录服务器方法

Window免密连接Linux系统 生成公匙 ssh-keygen -t rsa一路回车生成公钥 复制公匙&#xff0c;使用记事本打开复制全部内容 notepad C:\Users\DELL\.ssh\id_rsa.pub内容如"ssh-rsa AAAAB3NzaC1yc2EAAAA…" 远程登录服务器将内容写入~/.ssh/authorized_keys echo …...

3.26前端模拟面试

包含 Vue 3、TypeScript、性能优化、工程化等方面&#xff0c;偏八股文。 基础知识 Vue 3 响应式原理&#xff1a;Vue 3 如何实现响应式系统&#xff1f;Proxy 和 Reflect 的作用是什么&#xff1f; TypeScript 类型体操&#xff1a;实现一个 TypeScript 类型 DeepPartial&am…...

23种设计模式-备忘录(Memento)设计模式

备忘录设计模式 &#x1f6a9;什么是备忘录设计模式&#xff1f;&#x1f6a9;备忘录设计模式的特点&#x1f6a9;备忘录设计模式的结构&#x1f6a9;备忘录设计模式的优缺点&#x1f6a9;备忘录设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是…...

六十天Linux从0到项目搭建(第八天)(缓冲区、gitee提交)

一 缓冲区&#xff0c;C中有很多字符a. 可显字符 b.控制字符 在 C 语言 中&#xff0c;字符可以分为 可显字符&#xff08;Printable Characters&#xff09; 和 控制字符&#xff08;Control Characters&#xff09;&#xff0c;它们通常存储在 缓冲区&#xff08;Buffer&…...

QOpenGLWidget视频画面上绘制矩形框

一、QPainter绘制 在QOpenGLWidget中可以绘制,并且和OpenGL的内容叠在一起。paintGL里面绘制完视频后,解锁资源,再用QPainter绘制矩形框。这种方式灵活性最好。 void VideoGLWidget::paintGL() {glClear(GL_COLOR_BUFFER_BIT);m_program.bind();//绘制视频数据// 解绑VAOg…...

vue3 ts 封装axios,配置axios前置拦截器,让所有axios请求携带token

vue3 ts 封装axios,配置axios前置拦截器&#xff0c;让所有axios请求携带token http.tsapp.tsvue文件 http.ts import axios from axios // 引入axios import router from /router import Qs from qs import { ElMessage } from element-plusconst { prefixBasePath } requir…...

前端使用WPS WebOffice 做在线文档预览与编辑

先附上官网 WebOffice SDK 1、在下面这个地方找到jdk&#xff0c;然后下载 按照 2、只需要把jdk下载下来&#xff0c;放到项目中&#xff0c;然后引入到项目中就可以了&#xff0c;在wps 官网创建个应用&#xff0c;然后把appId放到代码中就可以了&#xff0c;等待后端把回调…...

在 CentOS 系统中开机自动执行 Shell 脚本

在 CentOS 系统中&#xff0c;可以通过以下方法设置开机自动执行 Shell 脚本。推荐使用 systemd 服务&#xff08;现代 Linux 系统的标准方式&#xff09;&#xff0c;也可以使用传统的 /etc/rc.local 方法。 方法 1&#xff1a;使用 Systemd 服务&#xff08;推荐&#xff09;…...

kotlin知识体系(四) : inline、noinline、crossinline 关键字对应编译后的代码是怎样的 ?

1. inline、noinline、crossinline 的作用 在 Kotlin 里&#xff0c;inline、noinline 和 crossinline 这几个关键字和高阶函数紧密相关&#xff0c;它们能够对高阶函数的行为进行优化和控制。本文接下来会详细介绍它们的作用和原理。 1.1 inline 关键字 inline 关键字用于修…...

Python电影市场特征:AR模型时间序列趋势预测、热图可视化评分影响分析IMDb数据|附数据代码

原文链接&#xff1a;https://tecdat.cn/?p41214 分析师&#xff1a;Zhiheng Lin 在数字时代&#xff0c;电影产业的数据分析已成为洞察市场趋势与用户偏好的重要工具。本专题合集聚焦印度电影市场&#xff0c;通过IMDb数据集&#xff08;IMDb Movies Dataset&#xff09;的深…...

【后端】【Django DRF】从零实现RBAC 权限管理系统

Django DRF 实现 RBAC 权限管理系统 在 Web 应用中&#xff0c;权限管理 是一个核心功能&#xff0c;尤其是在多用户系统中&#xff0c;需要精细化控制不同用户的访问权限。本文介绍如何使用 Django DRF 设计并实现 RBAC&#xff08;基于角色的访问控制&#xff09;系统&…...

使用docker部署springboot、Vue分离项目,部署到主路径

这几天写了一个小的应用&#xff0c;牵涉到了使用docker部署问题&#xff0c;中间遇到了一些小问题&#xff0c;此处记录下&#xff0c;为以后遇到类似的问题提供一些解决思路。 1、准备使用的镜像&#xff1a;mysql、redis、nginx、jdk。 镜像地址&#xff1a; docker pull s…...

大疆上云api直播功能如何实现

概述 流媒体服务器作为直播画面的中转站,它接收推流端的相机画面,同时拉流端找它获取相机的画面。整个流程如下: 在流媒体服务器上创建流媒体应用(app),一个流媒体服务器上面可以创建多个流媒体应用约定推拉流的地址。假设流媒体服务器工作在1935端口上面,假设创建的流…...

服务器数据恢复—Raid5热备盘同步中断的数据恢复案例

服务器数据恢复环境&#xff1a; 某公司一台存储上有一组由15块硬盘组建的raid5阵列。raid5阵列上层是一个xfs裸分区&#xff0c;起始位置是0扇区。 服务器故障&#xff1a; raid5阵列中有一块硬盘出现故障掉线&#xff0c;热备盘自动上线同步数据&#xff0c;数据同步还没有完…...

FFmpeg开发学习:AVFormatContext结构体

1.AvFormatContext结构体 是ffmpeg中用于处理多媒体文件的核心结构体之一&#xff0c;属于libavformat模块&#xff0c;主要负责描述一个多媒体文件或流的封装格式&#xff0c;用来打开&#xff0c;读取&#xff0c;写入&#xff0c;操作媒体文件&#xff08;如.MP4 .mkv .flv…...

Ceph集群2025(Squid版)导出高可用NFS集群(上集)

#创建一个CephFS 文件系统 ceph fs volume create cephfs02#创建子卷 ceph fs subvolumegroup create cephfs02 myfsg2#查看子卷 ceph fs subvolumegroup ls cephfs02[{"name": "myfsg2"} ]创建 NFS Ganesha 集群 #例子 $ ceph nfs cluster create <c…...

Python----计算机视觉处理(Opencv:图像边缘检测:非极大值抑制,双阈值筛选)

一、 高斯滤波 边缘检测本身属于锐化操作&#xff0c;对噪点比较敏感&#xff0c;所以需要进行平滑处理。这里使用的是一个5*5的高斯 核对图像进行消除噪声。 二、计算图像的梯度和方向 三、非极大值抑制 在得到每个边缘的方向之后&#xff0c;其实把它们连起来边缘检测就算完了…...

超微服务器主板重置ipmi登录密码

超微服务器主板重置ipmi登录密码 超微服务器的ipmi登录密码不对&#xff0c;需要重置但是bios内并没有找到可以设置的选项。 以下是解决办法&#xff1a; 安装IPMITOOL apt install ipmitool -y执行以下命令加载模块&#xff1a; modprobe ipmi_watchdog modprobe ipmi_po…...

【react18】react项目使用mock模拟后台接口

前后端分离项目&#xff0c;后端还没有接口的时候&#xff0c;前端可以使用mockjs的技术实行假数据的模拟。这里使用的是mock的库msw实现这个业务. MSW msw是mock的工具&#xff0c;官网地址是在这里 使用步骤 1.安装msw npm install mswlatest --save-dev2.新建存放mock接…...

阿里云国际站代理商:如何通过Serverless调用GPU资源?

1.采用支持GPU资源的Serverless系统 选择支持GPU资源的Serverless系统&#xff0c;如Dilu系统&#xff0c;它通过内省弹性&#xff08;introspectiveelasticity&#xff09;机制&#xff0c;提供细粒度和自适应的二维协同扩展机制&#xff0c;支持GPU资源按需分配。 2.系统…...

CI/CD(三) 安装nfs并指定k8s默认storageClass

一、NFS 服务端安装&#xff08;主节点 10.60.0.20&#xff09; 1. 安装 NFS 服务端 sudo apt update sudo apt install -y nfs-kernel-server 2. 创建共享目录并配置权限 sudo mkdir -p /data/k8s sudo chown nobody:nogroup /data/k8s # 允许匿名访问 sudo chmod 777 /dat…...

Ae 效果详解:音频波形

Ae菜单&#xff1a;效果/生成/音频波形 Generate/Audio Waveform 音频波形 Audio Waveform效果可以可视化音频信号&#xff0c;能以多种方式显示音频波形&#xff0c;包括沿开放或闭合的蒙版路径显示。 本效果适用于所有色深模式&#xff08;8-bpc、16-bpc、32-bpc&#xff09;…...

S7-1200对V90 PN进行位置控制的三种方法

S7-1200系列PLC通过PROFINET与V90 PN伺服驱动器搭配进行位置控制,实现的方法主要有以下三种: ? 方法一、在PLC中组态位置轴工艺对象,V90使用标准报文3,通过MC_Power、MC_MoveAbsolute等PLC Open标准程序块进行控制, 这种控制方式属于中央控制方式(位置控制在PLC中计算,驱…...