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

【C/C++】内存管理详解:从new/delete到智能指针的全面解析

文章目录

    • 更多文章
    • C/C++中的传统内存管理方式
      • `new`和`delete`运算符
      • `malloc`和`free`函数
      • 传统内存管理的弊端
    • 智能指针的崛起
      • 智能指针的定义与作用
      • C++11引入的标准智能指针
    • 详解C++标准智能指针
      • `std::unique_ptr`
        • 特点
        • 使用方法
        • 适用场景
      • `std::shared_ptr`
        • 特点
        • 使用方法
        • 适用场景
      • `std::weak_ptr`
        • 特点
        • 使用方法
        • 适用场景
    • 智能指针与传统内存管理的比较
      • 内存安全性
      • 性能考量
      • 使用复杂度
    • 智能指针的最佳实践
      • 选择合适的智能指针类型
      • 避免循环引用
      • 与传统指针的混用
      • 避免不必要的拷贝
      • 使用`make_*`函数
    • 案例教程:使用智能指针管理内存
      • 传统方法实现
      • 使用`std::unique_ptr`重构
      • 使用`std::shared_ptr`的场景
    • 更多文章
  • 结语

更多文章

【OpenAI】获取OpenAI API Key的多种方式全攻略:从入门到精通,再到详解教程!!

【VScode】VSCode中的智能编程利器,全面揭秘ChatMoss & ChatGPT中文版

【体验最新的GPT系列模型!支持Open API调用、自定义助手、文件上传等强大功能,助您提升工作效率!点击链接体验:CodeMoss & ChatGPT-AI中文版】
在这里插入图片描述

C/C++中的传统内存管理方式

在深入探讨智能指针之前,我们首先需要了解C/C++中传统的内存管理方式,以便更好地理解智能指针的优势所在。

newdelete运算符

在C++中,newdelete是用于动态分配和释放内存的运算符。

// 使用new分配内存
int* ptr = new int;// 使用delete释放内存
delete ptr;

通过new,程序员可以在堆上动态分配内存,而通过delete则可以手动释放这部分内存。然而,这种手动管理方式容易导致内存泄漏或悬挂指针等问题。

mallocfree函数

在C语言中,mallocfree函数用于动态内存分配和释放。

// 使用malloc分配内存
int* ptr = (int*)malloc(sizeof(int));// 使用free释放内存
free(ptr);

malloc函数返回一个void*指针,需要通过类型转换来使用。与new/delete类似,mallocfree也需要开发者手动管理内存,同样面临内存泄漏和其他相关问题。

传统内存管理的弊端

虽然new/deletemalloc/free为程序员提供了灵活的内存管理方式,但其手动管理的特性也带来了诸多弊端:

  1. 内存泄漏:如果开发者忘记调用delete或者free释放内存,程序会出现内存泄漏,长时间运行后可能导致系统资源耗尽。
  2. 悬挂指针:在释放内存后,指针仍然指向原来的地址,如果再次访问可能导致未定义行为。
  3. 异常安全性差:在异常发生时,手动管理的内存释放往往难以保证,容易导致资源泄漏。
  4. 代码复杂度高:需要在多个地方进行内存分配和释放,增加了代码的复杂性和维护难度。

这些问题不仅影响程序的稳定性和性能,还增加了开发和调试的难度。因此,寻求一种更安全、更高效的内存管理方式成为现代C++开发的重要课题。

智能指针的崛起

为了应对传统内存管理方式的诸多问题,C++11标准引入了智能指针,作为一种RAII机制,旨在自动管理内存资源,减少内存泄漏和其他相关问题的发生。
在这里插入图片描述

智能指针的定义与作用

智能指针是一种封装了普通指针的类,通过自动管理内存的分配和释放,简化了内存管理的过程。它们利用独占或共享所有权的概念,确保在对象不再使用时,自动释放相关资源,从而提高代码的安全性和可维护性。

智能指针的主要作用包括:

  1. 自动内存管理:避免手动调用deletefree,减少内存泄漏的风险。
  2. 异常安全:在异常发生时,智能指针能够确保资源被正确释放。
  3. 所有权管理:通过不同类型的智能指针,管理资源的独占或共享所有权,提高代码的表达力和安全性。

C++11引入的标准智能指针

C++11标准引入了三种主要的标准智能指针,分别适用于不同的使用场景:

  1. std::unique_ptr:独占所有权,不能被复制,适用于资源的独占管理。
  2. std::shared_ptr:共享所有权,多个shared_ptr可以指向同一资源,通过引用计数管理资源的生命周期。
  3. std::weak_ptr:观察者指针,不增加引用计数,主要用于解决shared_ptr之间的循环引用问题。

这些智能指针的引入极大地简化了内存管理过程,提升了代码的安全性和可维护性。

详解C++标准智能指针

为了全面掌握智能指针的使用,以下将对C++11标准中的三种主要智能指针进行详细解析,包括其特点、使用方法及适用场景。

std::unique_ptr

特点
  • 独占所有权unique_ptr拥有其所指向资源的独占所有权,不能被复制,只能被移动。
  • 轻量级:相比shared_ptrunique_ptr更为轻量,适用于简单的资源管理场景。
  • 自动释放:当unique_ptr生命周期结束时,自动调用delete释放资源,避免内存泄漏。
使用方法
#include <memory>void uniquePtrExample() {// 创建一个unique_ptrstd::unique_ptr<int> ptr(new int(10));// 访问指针std::cout << "Value: " << *ptr << std::endl;// 转移所有权std::unique_ptr<int> ptr2 = std::move(ptr);if (!ptr) {std::cout << "ptr is now null." << std::endl;}
}
适用场景
  • 资源的独占管理:适用于资源不需要被多个对象共享的场景,如单一对象的内部资源。
  • RAII模式:在资源管理的RAII模式中,unique_ptr是首选工具。
  • 性能要求高的场景:由于unique_ptr无引用计数,适用于对性能有严格要求的场景。

【体验最新的GPT系列模型!支持Open API调用、自定义助手、文件上传等强大功能,助您提升工作效率!点击链接体验:CodeMoss & ChatGPT-AI中文版】
在这里插入图片描述

std::shared_ptr

特点
  • 共享所有权:多个shared_ptr可以共同指向同一资源,通过内部的引用计数机制管理资源的生命周期。
  • 引用计数机制:每一个shared_ptr的拷贝都会增加引用计数,销毁时会减少引用计数,当引用计数为零时,自动释放资源。
  • 灵活性高:适用于多个对象需要共同管理同一资源的场景。
使用方法
#include <memory>void sharedPtrExample() {// 创建一个shared_ptrstd::shared_ptr<int> ptr1 = std::make_shared<int>(20);{// 复制shared_ptrstd::shared_ptr<int> ptr2 = ptr1;std::cout << "Value: " << *ptr2 << ", Use count: " << ptr1.use_count() << std::endl;}// ptr2超出作用域,引用计数减少std::cout << "Use count after ptr2 is destroyed: " << ptr1.use_count() << std::endl;
}
适用场景
  • 资源需要被多个对象共享:如共享的数据缓冲区、共享的资源池等。
  • 复杂的数据结构:如图结构、循环引用的场景(需要结合weak_ptr使用)。
  • 需要控制资源的生命周期:当资源的生命周期需要被多个部分共同管理时。

std::weak_ptr

特点
  • 非拥有性观察者指针weak_ptr不拥有资源的所有权,不影响引用计数。
  • 防止循环引用:在shared_ptr间可能产生的循环引用场景中,通过weak_ptr打破循环,避免内存泄漏。
  • 访问资源需转换:要访问资源,需先将weak_ptr转换为shared_ptr,确保资源在访问期间不会被释放。
使用方法
#include <memory>struct Node {std::shared_ptr<Node> next;std::weak_ptr<Node> prev; // 使用weak_ptr避免循环引用
};void weakPtrExample() {auto first = std::make_shared<Node>();auto second = std::make_shared<Node>();first->next = second;second->prev = first; // weak_ptr,不增加引用计数
}
适用场景
  • 打破循环引用:在涉及双向引用的数据结构中,如双向链表、图等。
  • 缓存系统:实现缓存时,weak_ptr可用于观察但不拥有缓存对象。
  • 临时访问:在需要临时访问资源但不希望延长其生命周期时。

智能指针与传统内存管理的比较

在了解了传统内存管理方式和智能指针的基本概念后,接下来将具体比较二者在内存安全性、性能和使用复杂度等方面的区别,为开发者选择合适的内存管理策略提供参考。

【体验最新的GPT系列模型!支持Open API调用、自定义助手、文件上传等强大功能,助您提升工作效率!点击链接体验:CodeMoss & ChatGPT-AI中文版】
在这里插入图片描述

内存安全性

传统方法

  • 手动管理内存,容易出现内存泄漏、悬挂指针等问题。
  • 开发者需要严格遵循内存分配和释放的规范,增加了出错的可能性。

智能指针

  • 自动管理内存,减少了人为忘记释放内存的风险。
  • 通过RAII机制,在对象生命周期结束时自动释放资源,提高了内存安全性。
  • weak_ptr有效防止了shared_ptr的循环引用问题。

性能考量

传统方法

  • 无额外的性能开销,适用于对性能有极高要求的场景。
  • 但由于手动管理,错误释放内存可能导致不可预测的性能问题。

智能指针

  • unique_ptr几乎无额外开销,适用于性能敏感的场景。
  • shared_ptr由于引用计数机制,存在一定的性能开销,尤其是在高频率的拷贝和销毁操作中。
  • weak_ptr本身开销较低,但在转换为shared_ptr时需要一定的计算。

使用复杂度

传统方法

  • 灵活性高,但需要开发者手动管理,增加了代码的复杂性和出错概率。
  • 在复杂的应用场景中,维护手动管理的代码较为困难。

智能指针

  • 提供了更高层次的抽象,简化了内存管理的流程。
  • 学习曲线相对较低,但需要理解不同智能指针的适用场景和使用方法。
  • 提高了代码的可读性和可维护性,减少了内存管理相关的出错概率。

智能指针的最佳实践

为了充分发挥智能指针的优势,开发者需要遵循一些最佳实践,合理选择和使用智能指针,避免潜在的问题。

选择合适的智能指针类型

  • std::unique_ptr:当资源拥有权是独占的,且不需要共享时,优先使用unique_ptr。它轻量且效率高,适合大多数独占资源的管理场景。

    std::unique_ptr<MyClass> ptr = std::make_unique<MyClass>();
    
  • std::shared_ptr:当资源需要被多个对象共享时,使用shared_ptr。确保没有不必要的共享所有权,以避免引用计数的额外开销。

    std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();
    std::shared_ptr<MyClass> ptr2 = ptr1;
    
  • std::weak_ptr:在需要观察但不拥有资源的场景中使用,特别是在打破shared_ptr循环引用时。

    std::weak_ptr<MyClass> weakPtr = sharedPtr;
    

避免循环引用

在某些场景,如树形结构、双向链表等,shared_ptr可能导致循环引用,进而引发内存泄漏。此时,应结合weak_ptr使用,打破循环引用。

struct Parent;
struct Child;struct Parent {std::shared_ptr<Child> child;
};struct Child {std::weak_ptr<Parent> parent; // 使用weak_ptr避免循环引用
};

与传统指针的混用

尽可能避免混用智能指针与原始指针,尤其是在管理同一资源时。若确实需要使用原始指针,确保它们仅作为观察者存在,不参与所有权管理。

std::unique_ptr<MyClass> ptr = std::make_unique<MyClass>();
MyClass* rawPtr = ptr.get(); // 仅作为观察者使用

避免不必要的拷贝

对于shared_ptr,避免不必要的拷贝操作,尤其是在高频率的函数调用中,因为每一次拷贝都会增加和减少引用计数,带来性能开销。

// 不推荐
void function(std::shared_ptr<MyClass> ptr);// 推荐
void function(const std::shared_ptr<MyClass>& ptr);

使用make_*函数

优先使用std::make_uniquestd::make_shared等工厂函数创建智能指针,避免手动使用new,提高代码的安全性和可读性。

auto ptr = std::make_unique<MyClass>();
auto sptr = std::make_shared<MyClass>();

案例教程:使用智能指针管理内存

通过一个实际案例,展示传统内存管理方式与智能指针的应用差异,帮助读者直观理解智能指针的优势。

传统方法实现

假设我们需要实现一个简单的类Person,并在主函数中动态创建和管理Person对象。

#include <iostream>
#include <string>class Person {
public:Person(const std::string& name) : name_(name) {std::cout << "Person " << name_ << " created." << std::endl;}~Person() {std::cout << "Person " << name_ << " destroyed." << std::endl;}void greet() const {std::cout << "Hello, I am " << name_ << "." << std::endl;}private:std::string name_;
};int main() {// 动态分配Person对象Person* person = new Person("Alice");person->greet();// 忘记释放内存,导致内存泄漏// delete person;return 0;
}

问题

  • 如果忘记调用delete person;,会导致内存泄漏。
  • 在异常发生时,delete可能无法被调用,进一步加剧内存泄漏的问题。

使用std::unique_ptr重构

通过使用std::unique_ptr,自动管理Person对象的生命周期,避免内存泄漏。

#include <iostream>
#include <string>
#include <memory>class Person {
public:Person(const std::string& name) : name_(name) {std::cout << "Person " << name_ << " created." << std::endl;}~Person() {std::cout << "Person " << name_ << " destroyed." << std::endl;}void greet() const {std::cout << "Hello, I am " << name_ << "." << std::endl;}private:std::string name_;
};int main() {{// 使用unique_ptr管理Person对象std::unique_ptr<Person> person = std::make_unique<Person>("Bob");person->greet();} // person超出作用域,自动调用deletereturn 0;
}

优势

  • 自动释放内存,无需手动调用delete
  • 即使在异常发生时,unique_ptr也能确保资源被正确释放。

使用std::shared_ptr的场景

假设我们有多个对象需要共享同一个Person对象,使用std::shared_ptr可以方便地管理共享所有权。

#include <iostream>
#include <string>
#include <memory>class Person {
public:Person(const std::string& name) : name_(name) {std::cout << "Person " << name_ << " created." << std::endl;}~Person() {std::cout << "Person " << name_ << " destroyed." << std::endl;}void greet() const {std::cout << "Hello, I am " << name_ << "." << std::endl;}private:std::string name_;
};void greetPerson(std::shared_ptr<Person> person) {person->greet();
}int main() {// 使用shared_ptr管理Person对象std::shared_ptr<Person> person = std::make_shared<Person>("Charlie");greetPerson(person);std::cout << "Use count: " << person.use_count() << std::endl;return 0;
}

优势

  • 通过shared_ptr,多个函数或对象可以共享同一个Person对象,而无需担心内存泄漏。
  • 当所有shared_ptr实例被销毁时,资源自动释放。

更多文章

【OpenAI】获取OpenAI API Key的多种方式全攻略:从入门到精通,再到详解教程!!

【VScode】VSCode中的智能编程利器,全面揭秘ChatMoss & ChatGPT中文版

结语

掌握内存管理不仅是C/C++开发者的必备技能,更是提升编程能力的重要一步。通过理解传统方法与智能指针的优劣,并灵活运用智能指针的各类工具,开发者能够编写出更加健壮、高效的代码,轻松应对复杂的开发挑战。希望本篇文章能够为你在内存管理的道路上提供有力的指导,助你在C/C++编程的世界中游刃有余。

相关文章:

【C/C++】内存管理详解:从new/delete到智能指针的全面解析

文章目录 更多文章C/C中的传统内存管理方式new和delete运算符malloc和free函数传统内存管理的弊端 智能指针的崛起智能指针的定义与作用C11引入的标准智能指针 详解C标准智能指针std::unique_ptr特点使用方法适用场景 std::shared_ptr特点使用方法适用场景 std::weak_ptr特点使…...

Vue.Draggable使用nested-with-vmodel进行拖拽

Vue.Draggable使用nested-with-vmodel进行拖拽 1. 介绍 ‌draggable‌是一个基于Sortable.js的Vue组件&#xff0c;用于实现拖拽功能。它支持触摸设备、拖拽和选择文本、智能滚动、不同列表之间的拖拽等功能&#xff0c;并且与Vue的视图模型同步刷新&#xff0c;兼容Vue2的过…...

MySQL 中的乐观锁与悲观锁

文章目录 MySQL 中的乐观锁与悲观锁一、引言二、乐观锁&#xff08;一&#xff09;原理&#xff08;二&#xff09;应用场景&#xff08;三&#xff09;示例代码 三、悲观锁&#xff08;一&#xff09;原理&#xff08;二&#xff09;应用场景&#xff08;三&#xff09;示例代…...

面试题分享(一)

实习的项目 成员规模 用到过哪些设计模式&#xff1f; 策略、单例、工厂、代理 责任链模式了解吗&#xff1f; 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;目的是为了避免请求的发送者与接收者之间的耦合关系。通…...

用天翼云搭建一个HivisionIDPhoto证件照处理网站

世人不必记我&#xff0c;我不记世人。 HivisionIDPhoto证件照处理网站 世人不必记我&#xff0c;我不记世人。项目地址项目搭建与修改前端后端遇到的坑 成果图 前段时间工作需要频繁处理证件照&#xff0c;当时同事推荐一个证件照小程序&#xff08;要看广告&#xff09;&…...

Conda环境迁移到内网

文章目录 一、conda是什么&#xff1f; conda环境迁移 二、迁移方法 1.docker方式 2.conda包方式 3.conda指定目录创建环境 4.pip方式 5.单个包安装 总结 前言 搞Python&#xff0c;使用conda是避免不了的&#xff0c;利用conda可以方便的管理多个不同的虚拟环境&…...

React Hooks中use的细节

文档 useState useState如果是以函数作为参数&#xff0c;那要求是一个纯函数&#xff0c;不接受任何参数&#xff0c;同时需要一个任意类型的返回值作为初始值。 useState可以传入任何类型的参数作为初始值&#xff0c;当以一个函数作为参数进行传入的时候需要注意&#xff…...

Android 16 开发者预览版抢先使用

Android 16 开发者预览版 获取 Android 16在 Google Pixel 设备上获取 Android 16设置 Android 模拟器 设置 Android 16 SDK获取 Android Studio安装 SDK更新应用的 build 配置 获取 Android 16 你可以通过以下任一方式获取 Android 16 在 Google Pixel 设备上获取 Android 1…...

蓝桥杯c++算法秒杀【6】之动态规划【上】(数字三角形、砝码称重(背包问题)、括号序列、组合数问题:::非常典型的必刷例题!!!)

下将以括号序列、组合数问题超级吧难的题为例子讲解动态规划 别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01;! ! ! ! &#xff01; 关注博主&#xff0c;更多蓝桥杯nice题目静待更新:) 动态规划 一、数字三角形 【问题描述】 上图给出了…...

c#:winform引入bartender

1、vs新建项目 ①选择Windows窗体应用&#xff08;.NET Framework&#xff09; 2、将bartender引入vs中 ①找到bartender的安装目录&#xff0c;复制Seagull.BarTender.Print.dll文件 ②粘贴到项目->bin->Debug文件&#xff0c;并可创建Model文件夹&#xff1a;为了存放…...

Zabbix 模板翻译自动化教程

在企业 IT 运维管理中&#xff0c;Zabbix 作为一款强大的开源监控平台被广泛应用。而 Zabbix 模板作为监控配置的重要组成部分&#xff0c;用来定义监控项、触发器、图形等。随着国际化的需求增加&#xff0c;Zabbix 模板的翻译工作变得日益重要&#xff0c;特别是在需要为不同…...

HarmonyOS开发:DevEco Studio的Beta3(5.0.5.200)新增和增强特性

新增特性 DevEco Studio支持开发API 13工程。DevEco Profiler Frame模板新增Lost Frames和Hitch Time泳道&#xff0c;用于识别和优化卡顿和丢帧现象。具体请参考Frame分析。hvigor-config.json5中properties下新增ohos.arkCompile.noEmitJs字段&#xff0c;用于指定ArkTS编译…...

macOS安装nvm node

macOS安装nvm macOS安装nvm创建 nvm 工作目录配置环境变量使用 nvm查看可用的 Node.js 版本安装特定版本 macOS安装nvm brew install nvm创建 nvm 工作目录 mkdir ~/.nvm配置环境变量 vim ~/.zshrc# nvm export NVM_DIR"$HOME/.nvm" [ -s "/opt/homebrew/opt…...

SpringBoot 集成MQTT实现消息订阅

1、引入依赖 <!--MQTT start--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-integration</artifactId></dependency><dependency><groupId>org.springframework.integrat…...

VM+Ubuntu18.04+XSHELL+VSCode环境配置

前段时间换了新电脑&#xff0c;准备安装Linux学习环境&#xff1a;VM虚拟机、Ubuntu18.04操作系统、XSHELL、XFTP远程连接软件、VSCode编辑器等&#xff0c;打算把安装过程记录一下。 1. 虚拟机介绍 为什么要用虚拟机&#xff1f; 想学习Linux操作系统&#xff0c;一般有3种…...

C#上机练习66-70

66.数组x中存有20个四位整数&#xff0c;请编制函数&#xff0c;求出正整数的个数tn。以及各位数字之和是偶数的数的个数tc,以及满足条件的这些数的算术平均ta.&#xff0c;将tn&#xff0c;tc&#xff0c;ta在控制台输出。 67.数组x中存有20个四位整数&#xff0c;请编制函数…...

pip 与当前python环境版本不匹配, pyenv, pipenv, conda

目录 pip 与当前python环境不匹配解决pip版本不一致 CondaPyenv pip 与当前python环境不匹配 电脑中安装了多个python虚拟环境, 有anaconda创建的虚拟环境,也有pyenv创建的虚拟环境,但是环境变量配置的是anaconda的路径 从而导致在vscode中选择的python版本是3.8.10,而pip却是…...

HAProxy面试题及参考答案(精选80道面试题)

目录 什么是 HAProxy? HAProxy 主要有哪些功能? HAProxy 的关键特性有哪些? HAProxy 的主要功能是什么? HAProxy 的作用是什么? 解释 HAProxy 在网络架构中的作用。 HAProxy 与负载均衡器之间的关系是什么? HAProxy 是如何实现负载均衡的? 阐述 HAProxy 的四层…...

ElasticSearch为什么不能在query阶段直接返回_id,从而避免fetch?

整理自Github的一个issue,也正好解答了我的疑惑 https://github.com/elastic/elasticsearch/issues/17159 提问 是否可以避免搜索的fetch阶段并仅返回文档ID&#xff1f;查询阶段结束时是否有_id&#xff0c;这样当我只需要_id时&#xff0c;fetch就多余了&#xff1f;可以通过…...

任意文件读取漏洞(CVE-2024-7928)修复

验证CVE-2024-7928问题是否存在可以使用如下方法&#xff1a; https://域名/index/ajax/lang?lang..//..//目录名/文件名&#xff08;不带后缀&#xff09; 目录名是该项目的一个目录&#xff0c;这里目录位置为nginx设置站点目录为基准&#xff0c;网上两层目录。 文件名…...

07 初始 Oracle 优化器

查询优化器&#xff0c;简称优化器&#xff0c;是数据库最核心的组件之一。我们在这个系列的第一篇文章中已经给大家介绍了&#xff0c;优化器会参与到SQL语句的解析过程中&#xff0c;用来生成SQL语句的执行计划&#xff0c;直接决定SQL语句执行性能的优劣。 什么是执行计划 …...

深入理解React Hooks:使用useState和useEffect

引言 React Hooks是React 16.8引入的一项强大功能&#xff0c;它使函数组件能够使用状态和其他React特性。本文将深入探讨两个最常用的Hooks&#xff1a;useState和useEffect&#xff0c;并通过实际代码示例展示它们的使用方法。 1. 什么是React Hooks&#xff1f; React Ho…...

深入浅出剖析典型文生图产品Midjourney

2022年7月,一个小团队推出了公测的 Midjourney,打破了 AIGC 领域的大厂垄断。作为一个精调生成模型,以聊天机器人方式部署在 Discord,它创作的《太空歌剧院》作品,甚至获得了美国「数字艺术/数码摄影」竞赛单元一等奖。 这一事件展示了 AI 在绘画领域惊人的创造力,让人们…...

大数据学习18之Spark-SQL

1.概述 1.1.简介 Spark SQL 是 Apache Spark 用于处理结构化数据的模块。 1.2.历史 1.2.1.Shark Hadoop诞生初期&#xff0c;Hive是唯一在Hadoop上运行的SQL-on-Hadoop工具&#xff0c;MR的中间计算过程产生了大量的磁盘落地操作&#xff0c;消耗了大量的I/O&#xff0c;降低…...

Flink开发入门简单案例--统计实时流订单

Flink开发入门简单案例 0.简介1.订单数据生成器1.1 新建工程TestFlink1.2 在pom.xml中引入Flink依赖包1.3 订单数据生成类订单类&#xff08;Item&#xff09;订单生成数据流类测试订单生成类 2.订单统计2.1 仅统计订单中商品的件数 2.2 同时统计商品数量和金额 0.简介 本案例…...

Scala身份证上的秘密以及Map的遍历

object test {def main(args: Array[String]): Unit {val id "42032220080903332x"//1.生日是&#xff1f;//字符串截取val birthday id.substring(10,14) //不包括终点下标println(birthday)val year id.substring(6,10) //println(year)//性别&#xff1a;倒数第…...

RabbitMQ

交换机 Fanout&#xff1a;广播Direct&#xff1a;定向路由Topic&#xff1a;匹配符 声明队列和交换机 基于Bean基于注解 消息转换器 JSON序列化...

全景图像(Panorama Image)向透视图像(Perspective Image)的跨视图转化(Cross-view)

一、概念讲解 全景图像到透视图像的转化是一个复杂的图像处理过程&#xff0c;它涉及到将一个360度的全景图像转换为一个具有透视效果的图像&#xff0c;这种图像更接近于人眼观察世界的方式。全景图像通常是一个矩形图像&#xff0c;它通过将球面图像映射到平面上得到&#xf…...

matlab 实现混沌麻雀搜索算法的光伏MPPT控制仿真

1、内容简介 略 103-可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

【设计模式】【行为型模式(Behavioral Patterns)】之策略模式(Strategy Pattern)

1. 设计模式原理说明 策略模式&#xff08;Strategy Pattern&#xff09; 是一种行为设计模式&#xff0c;它允许你定义一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以互换。策略模式让算法的变化独立于使用算法的客户。通过这种方式&#xff0c;客户端可…...

深度学习笔记之BERT(三)RoBERTa

深度学习笔记之RoBERTa 引言回顾&#xff1a;BERT的预训练策略RoBERTa训练过程分析静态掩码与动态掩码的比较模型输入模式与下一句预测使用大批量进行训练使用Byte-pair Encoding作为子词词元化算法更大的数据集和更多的训练步骤 RoBERTa配置 引言 本节将介绍一种基于 BERT \t…...

windows docker 入门

这个教程将指导你如何安装Docker、运行第一个容器以及理解一些基本概念。 第一步&#xff1a;安装Docker Desktop for Windows 系统要求&#xff1a; Windows 10 64位版本&#xff08;专业版、企业版或教育版&#xff09;。启用Hyper-V和Windows Subsystem for Linux (WSL 2)。…...

【软考速通笔记】系统架构设计师③——信息安全技术基础知识

文章目录 一、前言二、信息安全基础知识2.1 信息安全的基本要求2.2 信息安全的范围2.3 网络安全表现2.4 安全措施包括 三、信息安全系统的组成框架3.1 技术体系&#xff1a;3.2 组织机构体系&#xff1a;3.3 管理体系 四、信息加解密技术4.1 对称密钥加密算法4.2 非对称密钥加密…...

Spring Boot整合Redis Stack构建本地向量数据库相似性查询

Spring Boot整合Redis Stack构建本地向量数据库相似性查询 在微服务架构中&#xff0c;数据的高效存储与快速查询是至关重要的。Redis作为一个高性能的内存数据结构存储系统&#xff0c;不仅可以用作缓存、消息代理&#xff0c;还可以扩展为向量数据库&#xff0c;实现高效的相…...

设计模式-装饰者模式

背景 有一个咖啡馆有 单品咖啡&#xff1a;意大利浓咖啡、美式咖啡、无因咖啡 调料&#xff1a;牛奶、巧克力 点单时需要点一个单品咖啡&#xff0c;可以选择加调料或者不加。 最后计算价格。 较好的传统思路&#xff1a; 创建一个抽象的咖啡类&#xff0c;其中有各个调…...

.NetCore 过滤器和拦截器 的区别

Asp.NET Core 中的过滤器&#xff08;Filter&#xff09;和拦截器&#xff08;Interceptor&#xff09;是两个不同的概念&#xff0c;但它们在某些方面有相似之处&#xff0c;也有明显的区别。 &#x1f511;过滤器&#xff08;Filter&#xff09; 过滤器是Asp.NET Core中用于…...

uniapp实现APP版本升级

App.vue 直接上代码 <script>export default {methods: {//APP 版本升级Urlupload() {// #ifdef APP-PLUSplus.runtime.getProperty(plus.runtime.appid, (info) > {// 版本号变量持久化存储getApp().globalData.version info.version;this.ToLoadUpdate(info.versi…...

c语言的qsort函数理解与使用

介绍&#xff1a;qsort 函数是 C 标准库中用于排序的快速排序算法函数。它的用法非常灵活&#xff0c;可以对任意类型的元素进行排序&#xff0c;只要提供了比较函数即可。 qsort 函数原型及参数解释&#xff1a; void qsort ( void* base, //指向要排序的数组的首元素…...

k8s集群增加nfs-subdir-external-provisioner存储类

文章目录 前言一、版本信息二、本机安装nfs组件包三、下载nfs-subdir-external-provisioner配置文件并进行配置1.下载文件2.修改配置 三、进行部署备注&#xff1a;关于镜像无法拉取问题的处理 前言 手里的一台服务器搭建一个单点的k8s集群&#xff0c;然后在本机上使用nfs-su…...

IT成长之路-ubuntu驱动篇

历时3天的蹂躏&#xff0c;总结驱动安装全面教程。 步骤一、安装gcc、g和make包 #脚本更新 sudo apt-get update #编译gcc sudo apt-get install gcc #编译g sudo apt-get install g #编译make sudo apt-get install make 注意&#xff1a; gcc、g版本可能会导致显卡驱动安…...

AI大模型如何赋能电商行业,引领变革

目录 1.概述 1.1. 购物推荐系统 1.2. 会员分类与客户细分 1.3. 动态商品定价 1.4. 库存和供应链管理 1.5. 客户服务与体验 1.6. 内容生成与管理 2.AI技术在电商中的创新应用 2.1.淘宝 2.2.京东 2.3.华为 2.4.小米 3.AI技术在提高电商平台销售效率方面发挥的作用 …...

QT6学习第四天 感受QT的文件编译

QT6学习第四天 感受QT的文件编译 使用纯代码编写程序新建工程 使用其他编辑器纯代码编写程序并在命令行运行使用 .ui 表单文件生成界面使用自定义 C 窗口类使用现成的QT Designer界面类 使用纯代码编写程序 我们知道QT Creator中可以用拖拽的方式在 .ui 文件上布局&#xff0c…...

地平线 bev_cft_efficientnetb3 参考算法-v1.2.1

01 概述 在自动驾驶感知算法中 BEV 感知成为热点话题&#xff0c;BEV 感知可以弥补 2D 感知的缺陷构建 3D “世界”&#xff0c;更有利于下游任务和特征融合。 地平线集成了基于 bev 的纯视觉算法&#xff0c;目前已支持 ipm-based 、lss-based、 transformer-based&#xff…...

【linux】shell脚本

文章目录 1. jar包启动脚本1.1 方式一1.2 方式二 2. 进程关闭脚本3. 操作mysql4. impala建表语句提取5. 监控磁盘存量6. 清日志脚本7. 替换tomcat的启动端口8. 将一行数据按照空格依次读取 1. jar包启动脚本 1.1 方式一 #!/bin/sh RESOURCE_NAME/usr/local/applications/scre…...

构建一个去中心化的零售生态参与者的商业模型

在数字化和去中心化技术快速发展的背景下&#xff0c;传统零售行业正迎来革命性的转型。去中心化零售生态不仅让消费者、商家和内容创作者在同一平台上共同参与价值的创造和分配&#xff0c;还推动了零售体验、数据控制和社会互动的彻底变革。本文将探讨如何构建一个去中心化的…...

Spring Boot开发实战:从入门到构建高效应用

Spring Boot 是 Java 开发者构建微服务、Web 应用和后端服务的首选框架之一。其凭借开箱即用的特性、大量的自动化配置和灵活的扩展性&#xff0c;极大简化了开发流程。本文将以实战为核心&#xff0c;从基础到高级&#xff0c;全面探讨 Spring Boot 的应用开发。 一、Spring B…...

MyBatis(mybatis_plus)中TypeHandler的使用教程

MyBatis&#xff08;mybatis_plus&#xff09;中TypeHandler的使用教程 一.TypeHandler作用及其使用场景 在我们平常开发操作数据库时&#xff0c;查询、插入数据等操作行为&#xff0c;有时会报数据类型不匹配异常&#xff0c;就可以得知数据的类型是不唯一的必然是多种不同…...

【C++】IO库(三):string流

8.3 string 流 sstream 头文件定义了三个类型来支持内存 IO&#xff0c;这些类型可以向 string 写入数据&#xff0c;也可以从 string 读取数据&#xff0c;就像 string 是一个 IO 流一样。 istringstream 从 string 读数据&#xff1b;ostringstream 向 string 写入数据&…...

C# 反射详解

反射是C#中的一个强大特性&#xff0c;允许程序在运行时检查和操作类型和对象的信息。 通过反射&#xff0c;你可以获取类型的属性、方法、构造函数等信息&#xff0c;并可以动态创建对象、调用方法或访问属性&#xff0c;甚至可以实现某些框架或库的核心功能。 反射的基本概念…...

量化交易系统开发-实时行情自动化交易-8.量化交易服务平台(一)

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来会对于收集整理的33个量化交易服…...