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

C++ 内存管理

C++ 内存管理是程序设计的核心环节,直接影响程序的性能、稳定性和安全性。C++ 不像 Java、Python 等语言有自动垃圾回收机制,而是需要开发者手动管理动态内存(或通过智能指针等机制自动管理)。

1、C++ 内存分区

内存区域 存储内容 生命周期 管理方式
栈 (Stack) 函数参数、局部变量、函数返回值等 自动管理。在作用域开始时分配,作用域结束时自动释放。 编译器自动生成代码管理,效率极高。
堆/自由存储区 (Heap/Free Store) 动态分配的内存 手动管理。从 new 开始到 delete 结束。 程序员显式控制。分配和释放速度较慢,容易出错。
全局/静态存储区 (Global/Static) 全局变量、静态变量(static)、字面量 整个程序运行时。在 main 开始前初始化,main 结束后销毁。 编译器管理。
常量区 (Constant) 字符串字面量和其他常量 整个程序运行时。 编译器管理。通常不可修改。
代码区 (Code/Text) 程序的二进制代码(函数体) 整个程序运行时。 编译器管理。

图示:

+-----------------------+
|       栈 (Stack)      | <- 高地址,向下增长
+-----------------------+
|          ↓            |
|                       |
|          ↑            |
+-----------------------+
|       堆 (Heap)       | <- 低地址,向上增长
+-----------------------+
| 全局/静态区 (Global)   |
+-----------------------+
|   常量区 (Constants)   |
+-----------------------+
|   代码区 (Code/Text)   |
+-----------------------+ 

2、栈

  • 特点
    • 空间较小(通常几 MB),由操作系统自动分配和释放,遵循“先进后出”(FILO)原则。
    • 分配速度极快(仅需移动栈指针),适合存储短期存在的变量(如函数内的局部变量)。
void stackExample() {int x = 10; // `x` 在栈上分配std::string name = "Alice"; // `name` 对象本身在栈上,但其内部的动态数据可能在堆上double data[100]; // 数组 `data` 在栈上分配(如果100很大,可能导致栈溢出)} // 作用域结束,`x`, `name`, `data` 被自动销毁。// `std::string` 的析构函数会被调用,释放它可能占用的堆内存。

注意:不要返回指向栈内存的指针或引用!

int* dangerousFunction() {int localVar = 42;return &localVar; // 严重错误!返回后 localVar 已被销毁,指针悬空。
}

3、堆

  • 特点
    • 空间较大(通常几 GB),生命周期由开发者控制(需手动申请和释放),分配/释放速度较慢(涉及内存块查找、链表维护等)。
    • 内存地址不连续,频繁分配/释放可能产生内存碎片。

3.1 动态分配与释放:new / delete

new 运算符完成两件事:1) 在堆上分配足够的内存;2) 在该内存上构造对象(调用构造函数)。
delete 运算符也完成两件事:1) 调用对象的析构函数;2) 释放该对象占用的内存。

// 动态分配一个 int,并初始化为 5
int* ptr = new int(5); 
// 动态分配一个 MyClass 对象,调用其构造函数
MyClass* objPtr = new MyClass("Name", 10); // ... 使用 ptr 和 objPtr ...// 释放内存
delete ptr;    // 释放 int
delete objPtr; // 调用 ~MyClass(),然后释放内存
ptr = nullptr; // 良好实践:释放后立即置空,防止悬空指针
objPtr = nullptr;

3.2 分配/释放对象数组

// 动态分配一个包含10个int的数组
int* arrayPtr = new int[10]; 
// 动态分配3个MyClass对象,调用它们的默认构造函数
MyClass* objArrayPtr = new MyClass[3]; // ... 使用数组 ...// 释放数组内存。必须使用 delete[]!
delete[] arrayPtr;     // 正确:释放数组
delete[] objArrayPtr;  // 正确:调用每个元素的析构函数,然后释放内存// delete objArrayPtr; // 灾难性错误!行为未定义。只会调用第一个元素的析构函数,然后错误地释放内存。

3.3 new/delete和malloc/free

C++ 提供两种动态内存管理方式:C 语言兼容的 malloc/free,以及 C++ 特有的 new/delete

重要规则: 绝对不要混用!new 分配的内存必须用 delete 释放;用 malloc() 分配的内存必须用 free() 释放。

3.3.1 malloc/free(C 风格)
  • 函数原型

    void* malloc(size_t size);  // 分配 size 字节的内存,返回 void*(需强转)
    void free(void* ptr);       // 释放 ptr 指向的内存(ptr 必须是 malloc 分配的地址)
    
  • 特点

    • 仅分配内存,不调用对象的构造函数;释放内存时,不调用析构函数(仅适用于基本类型,不适合类对象)。
    • 需手动计算内存大小(如 malloc(sizeof(int) * 5))。
  • 示例

    int* p = (int*)malloc(sizeof(int)); // 分配 int 大小的内存(未初始化)
    *p = 10;                            // 手动赋值
    free(p);                            // 释放内存(p 变为野指针,建议置空)
    p = nullptr;
    
3.3.2 new/delete(C++ 风格)

new/delete 是 C++ 对动态内存管理的增强,不仅分配/释放内存,还会自动调用对象的构造函数析构函数,是管理类对象的首选方式。

  • 基本用法

    // 1. 分配单个对象
    MyClass* obj = new MyClass(10);  // 调用 MyClass(int) 构造函数
    delete obj;                      // 调用 MyClass 析构函数,释放内存// 2. 分配数组(必须用 new[] 和 delete[] 匹配)
    MyClass* arr = new MyClass[5];   // 调用 5 次 MyClass 默认构造函数
    delete[] arr;                    // 调用 5 次 MyClass 析构函数,释放数组
    
  • new 的底层原理
    new 操作分两步:

    1. 调用 operator new(size_t) 分配内存(类似 malloc);
    2. 在分配的内存上调用对象的构造函数。
  • delete 的底层原理
    delete 操作分两步:

    1. 调用对象的析构函数;
    2. 调用 operator delete(void*) 释放内存(类似 free)。

3.4 常见动态内存错误

3.4.1 内存泄漏 (Memory Leak)

分配了内存但忘记释放。
cpp void leak() { int* ptr = new int(100); // ... 使用了 ptr ... return; // 忘记 delete ptr; 内存泄漏! }

3.4.2 悬空指针 (Dangling Pointer)

指针指向的内存已被释放。
cpp int* ptr = new int(50); delete ptr; // 内存被释放 *ptr = 10; // 错误!ptr 现在是悬空指针,解引用它是未定义行为。

3.4.3 双重释放 (Double Free)

对同一块内存释放两次。
cpp int* ptr = new int(50); delete ptr; delete ptr; // 灾难!未定义行为,通常导致程序崩溃。

3.4.4 野指针 (Wild Pointer)

未初始化的指针。
cpp int* ptr; // 野指针,指向随机地址 *ptr = 10; // 极度危险!未定义行为。

4、全局/静态区

  • 特点

    • 全局变量和静态变量(包括 static 局部变量)存储于此,程序启动时初始化,结束时销毁。
    • static 局部变量仅在首次进入函数时初始化,生命周期延续到程序结束。
  • 示例

    int g_var = 10;         // 全局变量,存储在全局区
    static int s_var = 20;  // 静态全局变量,存储在全局区void func() {static int s_local = 30; // 静态局部变量,存储在全局区(仅初始化一次)
    }
    

5、常量区

  • 特点

    • 存储字符串常量(如 "hello")和 const 修饰的常量,内容只读(修改会导致未定义行为)。
  • 示例

    const int c_var = 100;   // const 常量,存储在常量区
    char* str = "hello";     // "hello" 存储在常量区,str 是栈上的指针
    

6、常见问题

  1. new/delete 和 malloc()/free() 有什么区别?
    new/delete 关心对象生命周期(构造/析构),而 malloc/free 只关心内存块。绝对不要混用。

  2. 什么是内存泄漏?如何避免?
    动态分配的内存不再被使用,但未被释放,导致内存浪费,长期运行可能耗尽内存。
    避免方法:

    • 优先使用栈对象:让编译器自动管理生命周期。
    • 使用智能指针:这是现代 C++ 最主要的手段。std::unique_ptr(独占所有权)和 std::shared_ptr(共享所有权)会在析构时自动释放内存。
    • 遵循 RAII 原则:将资源(内存、文件句柄等)的获取与对象的构造函数绑定,释放与析构函数绑定。
    • 成对使用 new/delete 和 new[]/delete[]:确保分配和释放方式匹配。
    • 使用工具检测:如 Valgrind、AddressSanitizer (ASan)、Visual Studio 诊断工具等。
  3. 为什么更推荐使用 std::make_shared 而不是直接 new?

    • 异常安全:如果函数参数在表达式求值过程中抛出异常,make_shared 能保证已分配的内存会被释放,而直接 new 可能会泄漏。
    • 性能:std::make_shared 通常只进行一次内存分配,同时容纳对象本身和控制块(引用计数等)。而 shared_ptr(new T(...)) 需要两次分配(一次给对象,一次给控制块)。
  4. 如何从 weak_ptr 安全地访问对象?
    使用 lock() 方法。它会返回一个 std::shared_ptr。如果原始对象还存在,这个 shared_ptr 是有效的;如果已被释放,则返回一个空的 shared_ptr。必须检查返回值。

std::weak_ptr<MyClass> weak = ...;if (auto shared = weak.lock()) { // 检查返回的shared_ptr是否为空// 对象还存在,可以安全使用 sharedshared->doSomething();
} else {// 对象已被释放std::cout << "Object is gone.\n";
}
  1. 什么是悬空指针 (Dangling Pointer) 和野指针 (Wild Pointer)?

悬空指针:指针指向的内存已被释放,但指针本身未被置空。解引用它是未定义行为

int* ptr = new int(10);
delete ptr; // 内存释放
// ptr 现在是悬空指针
*ptr = 20; // 未定义行为!
ptr = nullptr; // 良好实践:释放后立即置空。

野指针:未被初始化的指针,其值是随机的垃圾地址。

int* ptr; // 野指针
*ptr = 10; // 极度危险!未定义行为。
int* ptr2 = nullptr; // 正确:总是初始化指针。
  1. delete 和 delete[] 的区别是什么?混用会怎样?

delete:用于释放 new 分配的单个对象。它会调用该对象的析构函数。

delete[]:用于释放 new[] 分配的对象数组。它会调用数组中每个元素的析构函数,然后释放整块内存。

混用的后果:未定义行为。最常见的后果是程序崩溃。

用 delete 释放数组:只会调用第一个元素的析构函数,然后错误地释放内存。

用 delete[] 释放单个对象:会试图析构多个不存在的对象,导致内存结构被破坏。

  1. 什么是 RAII?它在 C++ 内存管理中如何体现?
  • RAII (Resource Acquisition Is Initialization):资源获取即初始化。是 C++ 最重要的编程理念之一。
  • 核心思想:将资源(内存、文件句柄、锁等)的生命周期与对象的生命周期绑定。
    • 获取资源:在对象的构造函数中完成(例如,std::ifstream 打开文件,std::unique_ptr 分配内存)。
    • 释放资源:在对象的析构函数中完成(例如,std::ifstream 关闭文件,std::unique_ptr 释放内存)。
  • 优势:无论函数是正常返回还是因异常提前退出,局部对象都会在离开作用域时被析构,从而保证资源一定能被释放。智能指针是 RAII 用于内存管理的完美体现
  1. 设计一个 unique_ptr,你会考虑哪些方面?
    • 封装一个原生指针作为成员。
    • 删除拷贝构造函数和拷贝赋值运算符= delete)以实现独占语义。
    • 实现移动构造函数和移动赋值运算符std::move)以支持所有权转移。
    • 析构函数中调用删除器(默认是 delete)释放资源。
    • 重载 operator*operator-> 以提供指针式的访问。
    • 提供 release(), reset(), get() 等成员函数。
    • (可选)支持自定义删除器(作为模板参数的一部分)。

相关文章:

C++ 内存管理

C++ 内存管理是程序设计的核心环节,直接影响程序的性能、稳定性和安全性。C++ 不像 Java、Python 等语言有自动垃圾回收机制,而是需要开发者手动管理动态内存(或通过智能指针等机制自动管理)。 1、C++ 内存分区内存区域 存储内容 生命周期 管理方式栈 (Stack) 函数参数、局…...

一些写了和没写的数学!

P8114 [Cnoi2021] 六边形战士 传送 非常好玩的题! 首先你大概率看过一些“无字证明”,其中很经典的是这个: 证明:用若干个边长为 \(1\),顶角为 \(60\) 度的菱形拼成一个边长为 \(n\) 的正六边形,三个方向的菱形个数一定相等。这是一个经典的无字证明,虽然前置的说明要费…...

【光照】[自发光Emission]以UnityURP为例

【从UnityURP开始探索游戏渲染】专栏-直达自发光的基本原理 $Cemissive=Memissive$ 自发光是物体表面主动发射光线的现象,在光照模型中通常作为独立于外部光源的附加项。其核心特点是不受其他光照影响,但可以影响周围环境。 实现流程‌定义发射颜色和强度‌:确定基础发光颜色…...

mybatis-plus初体验,解决报错Invalid value type for attribute factoryBeanObjectType: java.lang.String

解决报错Invalid value type for attribute factoryBeanObjectType: java.lang.String 推荐这位大佬的博客: https://www.cnblogs.com/muphy/p/18653627 项目结构MyBatis-Plus配置类MyBatisPlusConfig package com.example.config;import com.baomidou.mybatisplus.annotation…...

浅谈制氢电源及英飞凌解决方案

大家对氢元素肯定都不陌生,认识它基本都是从背元素周期表开始的。近年来我们身边多了很多氢的身影,从北京冬奥会的氢燃料电池大巴,再到广州南沙小虎岛电氢智慧能源站,氢也越来越被大家熟知。工业上,氢的使用可是一点都不少,自 1975 年以来,需求量增长了三倍,而且还在继…...

微算法科技(NASDAQ:MLGO)研究分布式量子计算,释放量子计算潜能

在信息时代,数据量呈指数级增长,经典计算机面临算力瓶颈。量子计算以其超强的并行处理能力,被视为下一世代计算范式的颠覆者。然而,单个量子处理器的脆弱性和制造难度限制了其广泛应用。微算法科技(NASDAQ:MLGO)研发团队研究通过分布式量子计算模型,将多个量子计算节点连…...

AI 重塑招聘三角:Moka 招聘智能体如何实现 HR、候选人与企业的三方共赢

AI 重塑招聘三角:Moka 招聘智能体如何实现 HR、候选人与企业的三方共赢在人才竞争进入白热化的今天,招聘早已不是 HR 单方面的 “筛选任务”,而是涉及 HR 效率、候选人体验、企业战略人才储备的三角关系。传统招聘模式下,这三角常常陷入 “HR 疲于奔命却难出成果、候选人等…...

Flash Attention原理

提出问题 Transformer 结构已成为自然语言处理和图像分类等应用中最常用的架构。尽管 Transformer 在规模上不断增大和加深,但处理更长上下文仍然是一个挑战,因为核心的自注意力模块在序列长度上具有二次方的时间和内存复杂度。这导致在处理长序列时速度变慢且内存需求巨大。…...

MSMQ 跨服务器读写队列的“消息队列系统的访问被拒绝”的解决方案

转:http://m.blog.csdn.net/blog/2000killer/8904852 在服务器上创建的Queue开发者的 机器只能写数据而不能读数据。.net给出的错误是“对消息队列系统的访问被拒绝”,也就是说拒绝访问队列没有相关权限,我给Everyone和 ANONYMOUS LOGON赋予全部权限都无法解决(正常情况下可…...

opencv学习记录1

img = cv2.imread(pic.jpg)#读图像 #封装函数 def cv_show(name,img):cv2.imshow(image,img)#显示图像cv2.waitKey(0)#显示时间cv2.destroyWindow()#读灰度图 img = cv2.imread(pic.jpg,cv2.IMREAD_GRAYSCALE) #保存 cv2.imwrite(name,img)#读视频 vc = cv2.VideoCapture(name)…...

kylin V10SP3安装mysql5.7.42

环境:OS:kylin V10SP3mysql:5.7.42查看系统glibc版本[root@localhost ~]# ldd --versionldd (GNU libc) 2.28Copyright (C) 2018 自由软件基金会。这是一个自由软件;请见源代码的授权条款。本软件不含任何没有担保;甚至不保证适销性或者适合某些特殊目的。由 Roland McGrath …...

MATLAB 仿真无线传感器网络(WSN)三大经典场景

一、统一参数区(建议先调这里) %% 0. 公共参数 clear; clc; close all; rng(2025) % 可重复 field = [0 100; 0 100]; % 100 m 100 m nNode = 200; % 节点数 R = 15; % 通信半径 /m E0 = 0.5; …...

9.05 DP 专题

Permutation Blackhole 按照过题人数顺序做题是这样的,如果要看难一点的建议向下 首先,不要读错题 QAQ 然后你现在发现每个位置只会在它被涂黑之前向最近放位置产生一次贡献,从 P 的角度思考是困难的,考虑从被涂黑的图的角度思考 你注意到我们每次涂完两个点之后,它们中间…...

MySQL主从复制 - 指南

MySQL主从复制 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14…...

阿里 Qoder 体验超预期,Repo Wiki 功能迎来全新升级

作者:沉默王二 大家好,我是二哥呀。 最近,阿里发布了一款名为 Qoder(/ˈkoʊdər/)的 Agentic 开发工具。我第一时间就去尝鲜了,其 Quest Mode 和 Repo Wiki 给我印象深刻。Quest Mode 主打一个 AI 自主研发,我们只需要把工程任务扔给他,Quest Mode 就会把模糊的需求翻…...

实用指南:ZooKeeper 的选举算法

实用指南:ZooKeeper 的选举算法pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; fon…...

JAVA获取keytab的Principal

依赖<dependency><groupId>org.apache.kerby</groupId><artifactId>kerb-client</artifactId><version>2.0.1</version></dependency> 代码执行Keytab keytab = Keytab.loadKeytab(new File("D:\\dl.keytab"));key…...

基于霍夫变换的MATLAB虹膜检测与分割实现

一、核心代码实现 function [iris_mask, pupil_center, iris_radius] = hough_iris_segmentation(img_path)% 读取图像并预处理img = imread(img_path);gray = rgb2gray(img);blurred = imgaussfilt(gray, 2); % 高斯滤波去噪denoised = medfilt2(blurred, [3 3]); % 中值滤波…...

Linux时间同步---NTP时间同步方案

1.方案背景: 在分布式系统或多服务器集群中,必须建立统一的时间同步机制。服务器间的时间不一致会破坏各类依赖时间交互逻辑,例如导致日志时序混乱、事务顺序错乱、证书验证失败等,从而引发一系列难以排查的不可预知故障。 2.NTP同步网络拓扑图: 3.同步方案 可提前咨询医…...

java预习

课前问题列表 1.什么样的方法应该用static修饰?不用static修饰的方法往往具有什么特性?Student的getName应该用static修饰吗?适合用 static 修饰的方法: 工具类方法(如Math.abs())、工厂方法、不需要访问实例变量 / 方法的方法、单例模式的获取实例方法等,这类方法通常与…...

B/S体系结构风格

三层B/S风格-概述 》浏览器/服务器(B/S)风格就是上述三层应用结构的一种实现方式,其具体结构为:浏览器/Web服务器/数据库服务器。 》B/S体系结构主要是利用不断成熟的WWW浏览技术,结合浏览的多种脚本语言,用通用浏览器就实现了原来需要复杂的专用软件才能实现的强大功能,…...

The 2024 CCPC Online Contest 7/12 L/B/K/D/J/E/C

Problem L. 网络预选赛 签到,直接模拟即可点击查看代码 #include<bits/stdc++.h> using namespace std; int main(){int n,m;cin>>n>>m;vector<string>a(n);for(int i=0;i<n;i++){cin>>a[i];}int sum=0;for(int i=0;i<n-1;i++){for(int j…...

在joule里面使用agent 功能

test: Dev: 1: structure 2: 本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究...

Feign动态URL配置

方式一、亲测可用,缺点是每个类都需要单独配置@FeignClient(value = "my-biz", url = "${external.my.biz_url}", configuration = FeignHeaderInterceptor.class) public interface MyBizFeign {}@Data @Component @RefreshScope @ConfigurationProperti…...

自动化部署工具 Jenkins 的安装与配置

Jenkins 是一个开源的自动化部署工具,广泛用于持续集成(CI)和持续交付(CD)流程。它支持自动化构建、测试和部署应用程序。以下是 Jenkins 的安装与配置的详细教程。1. 安装 Jenkins 以下步骤适用于 Linux 系统(以 Ubuntu 和 CentOS 为例),并包含安装必要的依赖环境。1.…...

pip 搭建源

搭建本地pip源主要可通过pypiserver、pip2pi或bandersnatch等工具实现,具体步骤如下: 工具选择与安装‌pypiserver‌:轻量级方案,适合快速搭建小型私有源,通过pip install pypiserver安装 ‌pip2pi‌:适合按需构建源,从requirements.txt生成索引,需配合pip install pip…...

qoj10093 Jump the Frog

题意 给出 \(n\) 个由 O 和 ~ 组成的字符串 \(s_i\),还有 \(m\) 个额外字符串,第 \(n+i\) 个字符串 \(s_{n+i}\) 由第 \(s_x\) 和 \(s_y\) \((x,y<n+i)\) 个字符串拼接得到,即 \(s_{n+i}=s_x+s_y\)。你需要对这 \(n+m\) 个字符串解决以下问题: 有一只青蛙从字符串的起点…...

new 和make

func NewCase() {// 通过new , 可以创建任意类型,并返回指针mpPtr := new(map[string]*user)if *mpPtr == nil { // 通过 * 获取指针内容fmt.Println("map 为空")}// sliceslicePtr := new([]user)if *slicePtr == nil {fmt.Println("slice 为空")}*sliceP…...

Ceres 常用 LossFunction 对比

Ceres 常用 LossFunction 对比...

测试开发全日制学徒班火热报名中|跟着名企大咖做真实项目,结业即上岗

测试开发全日制学徒班,采用系统化教学的全日制线下课程,通过「人工智能测试+自动化测试+Python开发+测试开发」四维能力培养体系,配备行业资深专家导师陪跑服务(私教1v1答疑+周末私教陪跑服务),全程采用企业级学徒制培养模式。 学员将参与真实企业级项目开发,完成测试全…...

墨刀是否能替代Axure?从产品经理三大画图能力深度分析

产品经理的工作离不开高效的视觉表达工具,尤其是在画思维导图、流程图和原型图这三大核心能力上。掌握好这三类图形的绘制能力,能极大提升产品设计效率,也有助于跨团队协作顺畅推进。 市面上众多原型设计工具,墨刀和Axure无疑是最具代表性的两个平台,甚至墨刀一度被很多产…...

AI 自动化智能体训练营

课程背景与解决的问题 你是否也有这样的困扰? 每天被大量重复劳动占据时间? 报表、PPT、文案写得慢,效率低? 想用 AI 提高效率,却不知道从哪入手? 想做副业/创业,但缺乏技术与工具? 👉 这门训练营,将带你从零开始,学会用 AI 自动化处理工作与运营事务,提升效率,创…...

微信商户绑定微信公众号、小程序

https://pay.weixin.qq.com/index.php/extend/merchant_appid/mapay_platform/account_manage版权木有,侵权不究,欢迎转载...

唯创知音AI语音交互芯片与模组介绍

AI语音交互已经成为智能产品的基础配置,比如常见的AI玩具、智能家居、带AI功能的蓝牙音响,还有汽车的智能车机和智能穿戴设备等。唯创知音顺应市场趋势推出了WT2606A系列的AI语音交互芯片,和WT3000A M06、WT3000A M07、WT3000A M08三款AI语音交互模组。WT2606A AI语音交互芯…...

k3s 高可用集群部署(内置 etcd + VIP + keepalived)

k3s 高可用集群部署(内置 etcd + VIP + keepalived) 一、节点规划master 节点:10.0.0.40、10.0.0.51、10.0.0.53 worker 节点:10.0.0.52、10.0.0.54 VIP(高可用入口):10.0.0.41二、离线包准备下载 k3s 安装脚本、二进制、镜像包 导入镜像到本地或 Harbor 打包所有安装文…...

问HashMap底层原理?

HashMap是基于数组+链表+红黑树的哈希表。用于存储键值对。 1.哈希计算和扰动处理,也就是Hash方法 每一个Object都有一个 .hashCode 方法。(哈希计算)在对hashmap进行插入和查询时,先调用key键的key.hashCode()方法获取一个未处理的int哈希值,在底层代码中该值被复制给变量…...

用 Go 重写 adbkit:原理、架构与搭建实践

用 Go 重写 adbkit:原理、架构与搭建实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impor…...

C语言环境搭建之Linux子系统使用vscode连接子系统

安装准备工作查看当前系统版本确保高于16215.0开启WSL Windows Subsystem for Linux(简称WSL)是一个为在Windows 10上能够原生运行Linux二进制可执行文件(ELF格式)的兼容层。安装步骤微软商城Microsoft Store安装Ubuntu(本人安装的版本是22.04)点击等待安装完成输入用户名跟…...

移远AT指令笔记

# 测试 AT - 测试AT指令功能是否正常# 模块相关 ATI - 查询模块信息 AT+CGMI - 查询模块制造商标识 AT+CGMM - 查询模块型号 AT+CGMR - 查询模块固件版本号# 网络相关 AT+QCCID - 查询集成电路卡识别码(ICCID) AT+GSN …...

数据类型

数据类型bool string byte int,uint,int8,int16,uint16,int32,uint32,int64,uint64 float32,float64,complex,complex64,complex128 rune uintptr 无符号整型,用于存放一个指针,该类型用于指针计算 结构类型 指针类型 数组 切片 map 集合 interface{} 接口 通道类型 函数类型 时…...

iphone运行windows系统

如何让iPhone运行Windows系统? 一、引言与背景介绍 随着科技的发展,用户对于设备的需求日益多样化。作为智能手机市场的领导者之一,iPhone拥有着强大的硬件性能和优秀的软件生态。然而,有些用户可能会好奇,是否有可能在iPhone上安装并运行Windows操作系统呢?本文将详细介…...

NVR接入录像回放平台EasyCVR视频融合平台语音对讲配置指南

NVR接入录像回放平台EasyCVR视频融合平台语音对讲配置指南国标GB28181视频平台EasyCVR视频融合平台可拓展性强、视频能力灵活,平台可提供视频监控直播、云端录像、云存储、录像检索与回看、告警、平台级联、云台控制、语音对讲、智能分析接入等功能。 其中,在语音对讲方面,N…...

Ubuntu filebrowser网盘工具安装

第一步,本地部署 FileBrowser 1,本教程使用 Linux Ubuntu 系统进行演示,首先输入以下命令更新软件包列表。 sudo apt-get update 2,访问 FileBrowser 的 GitHub 页面找到最新版本,并根据你的系统架构下载相应的二进制文件。例如,对于 64 位 Linux 系统,可以使用如下 wge…...

图片结构 - voasem

图片分析简介 图像文件有多种复杂的格式,可以用于各种涉及到元数据、信息丢失和无损压缩、校验、隐写或可视化数据编码的分析解密,都是 Misc 中的一个很重要的出题方向。涉及到的知识点很多(包括基本的文件格式,常见的隐写手法及隐写用的软件),有的地方也需要去进行深入的…...

ESP32做AP,ESP8266做station,遥控

ESP8266 (Station模式) → 发送数据 → ESP32 (AP模式) → 接收并处理数据 ESP32 (AP接收端) 代码#include <WiFi.h> #include <WiFiClient.h> #include <WiFiAP.h>// 设置AP的网络名称和密码 const char *ssid = "ESP32_AP"; const char *passwor…...

实用指南:25年高联:一试填空题解析(下篇)

实用指南:25年高联:一试填空题解析(下篇)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !im…...

Spring AOP 面向切面编程 - 浪矢

目录概念应用例子:在不修改源代码的前提下,对请求链路上的目标方法进行运行耗时的统计。 概念 用于将与业务无关,但是对多个对象产生影响的公共逻辑,抽取并封装为可用模块,模块命名为“切面”(Aspect),减少重复代码,降低耦合度。 应用例子:在不修改源代码的前提下,对…...

jvm内存泄漏的排查tips总结

以下是对这篇原文的总结,部分内容不够详细,请参考原文地址:https://juejin.cn/post/7255634554987020343 内存问题排查方法论 1. 问题定位流程确定进程:使用 ps aux --sort=-%mem 找出内存占用最高的进程 分层排查:按照堆内 → 堆外的顺序逐步分析 量化分析:通过计算得出…...

鼠你爱称重

<!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>小鼠体重语音录入工具 - 数字鼠号版</t…...

详细介绍:用户争夺与智能管理:定制开发开源AI智能名片S2B2C商城小程序的战略价值与实践路径

详细介绍:用户争夺与智能管理:定制开发开源AI智能名片S2B2C商城小程序的战略价值与实践路径pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&…...