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

ATEngin开发记录_5_C++日志打印引发的崩溃?一次虚函数调用引发的内存错误排查记录

该系列只做记录 不做教程 所以文章简洁直接 会列出碰到的问题和解决方案 只适合C++萌新

在使用 C++ 进行事件系统开发时,我遇到了一次由于调用虚函数 GetName() 输出日志而引发的崩溃问题。通过逐步排查、使用防御性编程和类型检查,最终定位到了隐藏的生命周期/类型问题,并找到了更安全的日志打印方式。本文记录了排查过程和背后原理,供自己和他人参考。

程序编译非常正常,就是在运行的时候总是弹出内存问题,查了很久才找到问题点!

文章目录

  • 成功编译运行之后发生崩溃
  • 解决方案: 防御性编程!
  • 复盘一下:
  • 总结一下:


成功编译运行之后发生崩溃

在这里插入图片描述

经过层层查询是这段代码出现了错误:

void OnEvent(at_engine::Event& event) override
{HZ_CLIENT_TRACE("{0}", event.ToString());
}

如果这个宏调用内部触发了格式化模板逻辑,而 event.GetName() 返回的是 const char*,但该指针是非法的(未初始化、返回了悬空的字符串等),那就可能崩了。


解决方案: 防御性编程!

void OnEvent(at_engine::Event& event) override
{try{auto type = event.GetEventType(); auto name = event.GetName(); HZ_CLIENT_TRACE("Event actual type: {}", typeid(event).name());HZ_CLIENT_TRACE("Event ptr: {}", (void*)&event);HZ_CLIENT_TRACE("EventType: {}", (int)type);HZ_CLIENT_TRACE("EventName: {}", name ? name : "null");} catch (const std::exception& e){HZ_CLIENT_ERROR("Exception in OnEvent: {}", e.what());}
}

复盘一下:

  1. 这次的程序崩溃排查了很久,因为编译正常,没有实际指出是哪里错误。之前在窗口回调鼠标事件的时候出现过解析不了事件类型的情况,于是在回调鼠标事件之前加了判断,解决了当时的问题,但是不能确定是不是由此引发了新问题。后来经过排查GLFW 初始化本身应该不会影响 layer 的调用,除非在 glfwCreateWindow 后有一些后续的状态或资源没有正确初始化。例如,如果在窗口创建后尝试在没有有效上下文的情况下渲染到某个图层,这可能会导致崩溃。
glfwSetWindowSizeCallback(m_Window, [](GLFWwindow* window, int width, int height){WindowData& data = *(WindowData*)glfwGetWindowUserPointer(window);data.Width = width;data.Height = height;WindowResizeEvent event(width, height);if (data.EventCallback)//这里就是新增的判断data.EventCallback(event);});

2.1 没有思路,准备一点点注释排查,然后新发现一旦运行m_LayerInsert_ = m_Layers_.insert(m_LayerInsert_, layer); 操作 就会报内存操作 。那么既然是内存泄露,那要不将Layer*替换成std::unique_ptr,使用智能指针来替代原始指针管理资源?

	void LayerStack::PushLayer(Layer* layer){m_LayerInsert_ = m_Layers_.emplace(m_LayerInsert_, layer);}

我们先来看一下区别:std::unique_ptr vs Layer*:(AI搜索)
在这里插入图片描述
2.2 针对智能指针和原始指针看一下区别:
使用 Layer*:

Layer* layer = new Layer();
layerStack.PushLayer(layer);
// ...
delete layer; // 要记得手动释放,否则内存泄露

使用 std::unique_ptr:

auto layer = std::make_unique<Layer>();
layerStack.PushLayer(std::move(layer));
// 不需要 delete,作用域结束或 vector 清理时会自动释放

2.3当然了 修改智能指针并不会只修改这一点点,我更改完所有相关的指针之后,发现崩溃依旧,那就不是这里的问题。


3.1 又经过一系列的排查,发现这段代码注释了就不崩溃了:

class ExampleLayer : public at_engine::Layer
{
public:ExampleLayer(): Layer("Example"){}void OnUpdate() override{HZ_CLIENT_INFO("ExampleLayer::Update");}void OnEvent(at_engine::Event& event) override{HZ_CLIENT_INFO("Event Type: {}", event.GetName()); //就是这句话 这里的event.GetName()}};

3.2 分析一下:最可能的原因:对象类型不匹配或指针已失效。

  1. 虚函数调用崩溃 => 对象不是你以为的类型,或者 vtable 坏了
  2. 引用或指针的生命周期越界了
  3. 是否可能有线程间访问 event 对象,但没有加锁?如下这种会导致未定义行为甚至崩溃:
    在这里插入图片描述

3.3添加更多的Log进行测试:

   try{auto type = event.GetEventType(); auto name = event.GetName(); HZ_CLIENT_TRACE("Event actual type: {}", typeid(event).name());HZ_CLIENT_TRACE("Event ptr: {}", (void*)&event);HZ_CLIENT_TRACE("EventType: {}", (int)type);HZ_CLIENT_TRACE("EventName: {}", name ? name : "null");} catch (const std::exception& e){HZ_CLIENT_ERROR("Exception in OnEvent: {}", e.what());}

  1. Log说明:
    1. APP: Event actual type: class at_engine::MouseMovedEvent事件对象确实是 MouseMovedEvent 类型,虚函数机制没有失效,也没有被对象切片!
    2. APP: Event ptr: 0xbd0e12de48 说明:对象地址是有效的,不是空指针或野指针。
    3. APP: EventType: 14 和 APP: EventName: MouseMoved 说明:GetEventType() 和 GetName() 都正常调用成功,字符串返回值也没问题。
    4. ATEngine: MouseMovedEvent: 1255, 28 说明对 MouseMovedEvent 的 ToString() 重载输出,说明整个事件对象生命周期和成员访问都正常。
      在这里插入图片描述

  1. 如果这个宏调用内部触发了格式化模板逻辑,而 event.GetName() 返回的是 const char*,但该指针是非法的(未初始化、返回了悬空的字符串等),那就可能崩了。
HZ_CLIENT_TRACE("{}", event.GetName());

总结一下:

1.先看原先会报错写法:

HZ_CLIENT_INFO("Event Type: {}", event.GetName());

2.再看不会报错写法:

auto type = event.GetEventType(); 
auto name = event.GetName(); 
HZ_CLIENT_TRACE("Event actual type: {}", typeid(event).name());
  1. 区别在于:情况一:没有对象切片,一切正常
    如果 event 是一个有效的派生类对象引用,比如 MouseMovedEvent&,那么两种写法本质上是等价的 —— 都调用了虚函数 GetName(),从派生类中获取返回值。

  2. 区别在于:情况二:对象切片 或 引用悬空

Event e = MouseMovedEvent(...);  // 对象切片:派生类内容被"砍掉"
OnEvent(e);                      // 传的是 base Event 类型

event.GetName() 实际上不会调用到 MouseMovedEvent::GetName(),而是 Event::GetName()(如果不是纯虚函数)
如果 GetName() 是 virtual 并强行向下访问派生内容,会访问无效内存或崩溃

5.区别在于:event 引用或指针指向了一个已释放对象 比如一个临时对象或栈上变量已经离开作用域。
6.区别在于:日志系统在展开 event.GetName() 的时候发生副作用如果 GetName() 返回的是 const char*,而它背后用到了临时字符串或者 dangling 指针,就容易出问题。

7.为什么分开写就没问题?

auto name = event.GetName();  // 这里立即将结果保存下来

8.举个例子:
GetName() 是这样实现的:

virtual const char* GetName() const override {std::string result = fmt::format("MouseMovedEvent: {}, {}", m_X, m_Y);return result.c_str(); // ❌ 返回了临时对象的 c_str
}

9.所以最终安全写法:

auto name = std::string(event.GetName()); // 复制一份内容
HZ_CLIENT_INFO("Event Type: {}", name);
}

10.总结一下
在这里插入图片描述

相关文章:

ATEngin开发记录_5_C++日志打印引发的崩溃?一次虚函数调用引发的内存错误排查记录

该系列只做记录 不做教程 所以文章简洁直接 会列出碰到的问题和解决方案 只适合C萌新 在使用 C 进行事件系统开发时&#xff0c;我遇到了一次由于调用虚函数 GetName() 输出日志而引发的崩溃问题。通过逐步排查、使用防御性编程和类型检查&#xff0c;最终定位到了隐藏的生命…...

Yocto项目实战教程 · 第4章:4.2小节-菜谱

&#x1f50d; B站相应的视频教程&#xff1a; &#x1f4cc; Yocto项目实战教程-第4章-4.2小节-菜谱 记得三连&#xff0c;标为原始粉丝。 在 Yocto 项目中&#xff0c;**菜谱&#xff08;Recipe&#xff09;**承载了包的配置信息、源码获取方式、编译与安装步骤&#xff0c;是…...

7.Rust+Axum:打造高效 RESTful API 的最佳实践

摘要 深入探讨 RustAxum 开发 RESTful API 的关键要点&#xff0c;涵盖资源路由设计、HATEOAS 实现、参数处理及 DTO 序列化与 JSON 处理案例。 一、引言 在现代 Web 开发中&#xff0c;RESTful API 是构建分布式系统的重要组成部分。Rust 作为一种高性能、安全的系统编程语…...

CAN总线嵌入式开发实战:从入门到精通

CAN总线嵌入式开发实战&#xff1a;从入门到精通 一、CAN总线基础概念 CAN(Controller Area Network)是一种广泛应用于汽车电子和工业控制领域的串行通信协议&#xff0c;由Bosch公司于1986年开发。它具有以下核心特点&#xff1a; 多主架构&#xff1a;所有节点地位平等&am…...

从头学 | 目标函数、梯度下降相关知识笔记(一)

很多基本的概念最近忘的有点多&#xff0c;简单回顾一些 文章目录 1 目标函数、梯度下降1.1 回归模型中的目标函数1.1.1 回归任务目标函数(1) 均方误差&#xff08;MSE&#xff09;(2) Huber损失 1.1.2 分类任务目标函数(1) 交叉熵损失&#xff08;Cross-Entropy&#xff09;(2…...

欣佰特携数十款机器人相关前沿产品,亮相第二届人形机器人和具身智能行业盛会

2025年4月15日至16日&#xff0c;备受关注的第二届中国人形机器人与具身智能产业大会已在北京成功举行。作为国内前沿科技及产品服务领域的重要参与者&#xff0c;欣佰特科技携众多前沿产品精彩亮相&#xff0c;全方位展示了其在人形机器人与具身智能领域的创新产品。 在本次大…...

QT常见显示类控件及其属性

Label QLabel可用用来显示文本和图片 核心属性如下 文本格式---textFormat 例&#xff1a; 在ui界面创建3个label&#xff0c;分别用不同的显示格式 在构造函数进行文本格式和文内容设置 此时运行后三种显示格式无区别 可以给富文本加标签 如<B>表示加粗 如果将<…...

基于领域知识的A型主动脉夹层综合分割及面向临床的评估|文献速递-深度学习医疗AI最新文献

Title 题目 Domain knowledge based comprehensive segmentation of Type-A aortic dissection with clinically-oriented evaluation 基于领域知识的A型主动脉夹层综合分割及面向临床的评估 01 文献速递介绍 A型主动脉夹层&#xff08;TAAD&#xff09;是一种医疗急症&a…...

守护进程编程、GDB调试以及外网连接树莓派

目录 一、什么是守护进程以及如何创建守护进程1. 什么是守护进程&#xff1f;2. 如何创建守护进程&#xff1f; 二、什么是GDB调试以及如何用GDB命令调试C程序1. 什么是GDB&#xff1f;2. 如何用GDB命令调试C程序&#xff1f; 三、外网访问树莓派 一、什么是守护进程以及如何创…...

HTML理论题

1.什么是HTML? 超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。 2.DOCTYPE 的作用是什么?标准与兼容模式(混杂模式)各有什么区别? DOCTYPE 的作用是告知浏览器的解析器用什么文档标准解析这个文档。 标准模式:用于…...

Cables为链上社区树立标杆:专注于实用性、用户主权与全球流动性

在 Web3 世界&#xff0c;“社区”这个词已逐渐沦为炒作、虚高数据与短暂参与的代名词。Cables 正在颠覆这一现状&#xff0c;以真实贡献与长期可持续发展为核心&#xff0c;走出了一条独特的路径。 最近&#xff0c;Cables 推出了其核心长期战略之一——积分计划&#xff08;…...

Clickhouse 配置参考

Clickhouse 配置参考 适用版本 21.3.9.84 config.xml 配置 <?xml version"1.0"?> <!--NOTE: User and query level settings are set up in "users.xml" file. --> <yandex><access_control_path>/data/clickhouse/clickhous…...

thinkphp实现图像验证码

示例 服务类 app\common\lib\captcha <?php namespace app\common\lib\captcha;use think\facade\Cache; use think\facade\Config; use Exception;class Captcha {private $im null; // 验证码图片实例private $color null; // 验证码字体颜色// 默认配置protected $co…...

【Pandas】pandas DataFrame where

Pandas2.2 DataFrame Indexing, iteration 方法描述DataFrame.head([n])用于返回 DataFrame 的前几行DataFrame.at快速访问和修改 DataFrame 中单个值的方法DataFrame.iat快速访问和修改 DataFrame 中单个值的方法DataFrame.loc用于基于标签&#xff08;行标签和列标签&#…...

redis利用备忘录

fofa: icon_hash"864611937" 防护&#xff1a; redis的安全设置&#xff1a;设置完毕&#xff0c;需要重加载配置文件启动redis 1.绑定内网ip地址进行访问 2. requirepass设置redis密码 3.保护模式开启protected-mode开启&#xff08;默认开启&#xff09; 4.最好把…...

【dify实战】chatflow结合deepseek实现基于自然语言的数据库问答、Echarts可视化展示、Excel报表下载

dify结合deepseek实现基于自然语言的数据库问答、Echarts可视化展示、Excel报表下载 观看视频&#xff0c;您将学会 在dify下如何快速的构建一个chatflow&#xff0c;来完成数据分析工作&#xff1b;如何在AI的回复中展示可视化的图表&#xff1b;如何在AI 的回复中加入Excel报…...

医疗行业如何构建合成数据平台?——技术、合规与实践全景

目录 医疗行业如何构建合成数据平台&#xff1f;——技术、合规与实践全景 一、为什么医疗领域尤需合成数据&#xff1f; 二、平台功能全景图 ✅ 模块划分&#xff1a; 三、典型合成数据生成方式 1. 结构化病例合成 2. 医学图像生成 3. 多轮医生-患者问答合成 四、数据…...

6.8.最小生成树

一.复习&#xff1a; 1.生成树&#xff1a; 对于一个连通的无向图&#xff0c;假设图中有n个顶点&#xff0c;如果能找到一个符合以下要求的子图&#xff1a; 子图中包含图中所有的顶点&#xff0c;同时各个顶点保持连通&#xff0c; 而且子图的边的数量只有n-1条&#xff0…...

MATLAB 控制系统设计与仿真 - 37

范数鲁棒控制器的设计 鲁棒控制器的设计 根据双端子状态方程对象模型结构&#xff0c;控制器设计的目标是找到一个控制器K(s),它能保证闭环系统的范数限制在一个给定的小整数下&#xff0c;即 这时控制器的状态方程为&#xff1a; 其中X与Y分别为下面两个代数Riccati方程的解…...

社交媒体时代的隐私忧虑:聚焦Facebook

在数字化时代&#xff0c;社交媒体平台已成为人们日常生活的重要组成部分。Facebook作为全球最大的社交媒体之一&#xff0c;拥有数十亿用户&#xff0c;其对个人隐私的影响和忧虑也日益凸显。本文将探讨社交媒体时代下&#xff0c;尤其是Facebook平台上的隐私问题。 数据收集…...

9.Rust+Axum 测试驱动开发与性能优化全攻略

摘要 本文深入讲解 RustAxum 测试驱动开发及性能优化&#xff0c;涵盖多种测试工具与优化技术。 一、引言 在当今的软件开发领域&#xff0c;测试驱动开发&#xff08;TDD&#xff09;和性能优化是保障软件质量和性能的关键环节。Rust 作为一种安全、高效的系统编程语言&…...

中国首个全国34省3,667个城市多属性建筑数据集(屋顶、高度、结构、功能、风格、年龄、质量等属性)

中国首个全国34省3,667个城市多属性建筑数据集&#xff08;屋顶、高度、结构、功能、风格、年龄、质量等属性&#xff09; 数据介绍 快速获取三维&#xff08;3D&#xff09;建筑数据&#xff0c;包括屋顶、高度和方向等几何属性&#xff0c;以及功能、质量和年龄等指示性属性…...

探索Spring Boot Web模块:设计思想与技术实现

探索Spring Boot Web模块&#xff1a;设计思想与技术实现 在现代Web开发中&#xff0c;Spring Boot作为一个强大的框架&#xff0c;提供了丰富的功能来简化Web应用的开发。本文将深入探讨Spring Boot框架中Web模块的核心类&#xff0c;揭示其设计思想、技术实现以及扩展知识。…...

GitHub创建远程仓库

使用GitHub创建远程仓库&#xff1a;从零开始实现代码托管与协作 前言 在当今软件开发领域&#xff0c;版本控制系统已成为开发者必备的核心工具。作为分布式版本控制系统的代表&#xff0c;Git凭借其强大的分支管理和高效的协作能力&#xff0c;已成为行业标准。而GitHub作为…...

PLM系统如何支持利益相关者分析?沟通矩阵设计

PLM&#xff08;产品生命周期管理&#xff09;系统在现代企业的产品研发与管理过程中扮演着至关重要的角色。它不仅仅是一个管理产品数据的工具&#xff0c;更能在利益相关者分析以及沟通矩阵设计方面提供强大的支持。通过合理运用PLM系统&#xff0c;企业能够更好地识别、理解…...

每日一题(8) 求解矩阵最小路径和问题

给定一个m行n列的矩阵&#xff0c;从左上角开始每次只能向右或者向下移动&#xff0c;最后到达右下角的位置&#xff0c;路径上的所有数字累加起来作为这条路径的路径和。求所有路径和中最小路径和。 输入格式: 首先输入行数m及列数n&#xff0c;接下来输入m行&#xff0c;每…...

JAVA设计模式:注解+模板+接口

1.基础组件 1.1注解类控制代码执行启动、停止、顺序 /*** author : test* description : 数据同步注解* date : 2025/4/18*/ Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented public interface SyncMeta {/*** 执行服务名称* return*/String name…...

如何在Linux系统中部署C++ Web应用

在 Linux 上部署 C Web 应用&#xff0c;和部署传统的 PHP 或 Node.js 应用相比更“原生”一些&#xff0c;通常涉及到自己编译、配置 Web 服务、处理依赖等。本文将详细讲解部署一个基于 C 编写的 Web 应用的完整流程&#xff0c;涵盖从构建、部署、到上线的每一步&#xff0c…...

实用工具-screenrec介绍(截图工具)

官方地址&#xff1a;Communicate Faster with Instant Video Messages & Screenshots 官方下载安装包&#xff0c;安装完成后&#xff0c;默认快捷键 alt s 开启截图&#xff0c;录屏 介绍 ScreenRec 是一款免费无广告的屏幕录制与截图工具&#xff0c;支持多平台&…...

使用veaury,在vue项目中运行react组件

网上的信息太少了&#xff0c;记录一下 我的项目是vue3webpack 使用&#xff1a;veaury Veaury 是基于React和Vue3的工具库&#xff0c;主要用于React和Vue在一个项目中公共使用的场景&#xff0c;主要运用在项目迁移、技术栈融合的开发模式、跨技术栈使用第三方组件的场景。 参…...

开源 vs. 闭源:大模型的未来竞争格局

开源 vs. 闭源&#xff1a;大模型的未来竞争格局 引言 在人工智能领域&#xff0c;尤其是大型语言模型(LLM)的发展中&#xff0c;开源与闭源之争已成为决定行业未来走向的关键议题。随着ChatGPT的横空出世和开源模型的蓬勃发展&#xff0c;技术社区正经历着一场深刻的范式转变…...

pcl代码解析

一、库基础代码解析&#xff1a; PCL库基础&#xff1a;点云类型与算法详解-CSDN博客 主要介绍PCL库的一些基本的点云类型、相关数据类型以及ROS接口消息&#xff0c;和一些常用的算法。 用到的一些PCL点云类型 pcl::PointXYZ: 这是最简单也可能是最常用到的点类型;它只储存…...

中华传承-医山命相卜-梅花易数

梅花易数 灵活起卦&#xff08;如数字、声音、外应等&#xff09;和象数结合&#xff0c;准确率可达96.8%。其起卦方式摆脱传统龟壳、蓍草的繁琐&#xff0c;强调直觉与灵活性。 个人决策、事件预测等 尤其在短期、具体问题上表现突出。...

HOOPS Exchange 与HOOPS Communicator集成:打造工业3D可视化新标杆!

一、概述 在工业3D开发、BIM建筑、数字孪生和仿真分析等高端应用场景中&#xff0c;数据格式复杂、模型体量庞大、实时交互体验要求高&#xff0c;一直是困扰开发者的难题。Tech Soft 3D旗下的HOOPS Exchange和HOOPS Communicator&#xff0c;正是解决这类问题的黄金搭档。二者…...

SQL预编译——预编译真的能完美防御SQL注入吗

SQL注入原理 sql注入是指攻击者拼接恶意SQL语句到接受外部参数的动态SQL查询中&#xff0c;程序本身 未对插入的SQL语句进行过滤&#xff0c;导致SQL语句直接被服务端执行。 拼接的SQL查询例如&#xff0c;通过在id变量后插入or 11这样的条件&#xff0c;来绕过身份验证&#…...

通过 Zotero 的样式编辑器(Style Editor)自定义文献引用和参考文献列表的格式

好的&#xff01;以下是一个更为详细的教程&#xff0c;帮助你通过 Zotero 的样式编辑器&#xff08;Style Editor&#xff09;自定义文献引用和参考文献列表的格式。 详细教程&#xff1a;使用 Zotero 样式编辑器自定义文献格式 1. 准备工作 在开始之前&#xff0c;请确保&a…...

PostgreSQL 通过 copy 命令导入几何数据 及 通过 CopyManager.copyIn() 导入几何数据

COPY命令介绍 copy是postgresql提供的一个专门用于快速导入导出数据的命令,通常用于从文件(TXT、CSV等)或标准输入输出中读取或写入数据。适合批量导入导出数据,速度快。 默认情况下,如果在处理过程中遇到错误,COPY将失败。 COPY只能用于表,不能用于视图!!! COPY…...

Next.js 技术详解:构建现代化 Web 应用的全栈框架

1. Next.js 概述 Next.js 是一个基于 React 的全栈框架&#xff0c;由 Vercel 团队开发和维护。它提供了一系列开箱即用的功能&#xff0c;使开发者能够快速构建高性能的 Web 应用。 核心优势 服务端渲染 (SSR)静态站点生成 (SSG)增量静态再生成 (ISR)文件系统路由API 路由图…...

【unity实战】Unity动画层级(Animation Layer)的Sync同步和Timing定时参数使用介绍,同步动画层制作角色的受伤状态

文章目录 前言方案一&#xff1a;复制粘贴原有层级的状态机1、实现2、问题 方法二&#xff1a;勾选Sync同步动画层1、简单实现同步2、同步blend tree的问题3、动画状态的播放时长4、下层状态覆盖了上层状态 专栏推荐完结 前言 如何制作角色的受伤状态&#xff1f; 玩家角色在…...

NFC 碰一碰发视频源码搭建,碰一碰发视频定制化开发技术

在移动互联时代&#xff0c;便捷的数据传输方式备受青睐。NFC&#xff08;近场通信&#xff09;技术以其操作简单、连接迅速的特性&#xff0c;为设备间的数据交互提供了高效解决方案。通过搭建 NFC 碰一碰发视频功能&#xff0c;用户只需将支持 NFC 的设备轻轻靠近&#xff0c…...

获取视频封面

目录 实现方式注意事项代码实现 实现方式 通过 video 元素canvas 元素的方式实现 生成 video 和 canvas 元素当 video 元素资源加载完成时&#xff0c;将 video 元素绘制到 canvas 画布上&#xff0c;然后通过 toBlob 或则 toDataURL 获取到对应的封面图片资源 注意事项 vid…...

c#开发大冲锋游戏登录器

1 前言 本文主要分享登录器的简要开发过程&#xff0c;只适合小白选手&#xff0c;高手请自动避让。 此项目是复刻大冲锋计划中的子集。 &#xff08;注&#xff1a;大冲锋是迅雷代理的一款次时代多职业第一人称FPS射击游戏&#xff0c;目前已经关服嗝屁。&#xff09; 2 …...

堆的实现以及利用堆进行排序

堆 堆的实现1. 什么是堆&#xff1f;2. 最小堆的核心操作2.1 初始化堆2.2 销毁堆2.3 插入元素2.4 删除堆顶元素2.5 获取堆顶元素2.6 判断堆是否为空 3. 调整堆的算法3.1 向上调整3.2 向下调整 4. 测试代码 堆排序一.向下调整建堆二.向上调整建堆 时间复杂度分析向上建堆分析&am…...

FPGA-VGA

目录 前言 一、VGA是什么&#xff1f; 二、物理接口 三、VGA显示原理 四、VGA时序标准 五、VGA显示参数 六、模块设计 七、波形图设计 八、彩条波形数据 前言 VGA的FPGA驱动 一、VGA是什么&#xff1f; VGA&#xff08;Video Graphics Array&#xff09;是IBM于1987年推出的…...

仿腾讯会议项目开发——界面关闭功能实现

目录 1、include(./netapi/netapi.pri) 2、加快构建速度 3、INCLUDEPATH./netapi 4、添加控制类 5、用单例模式创建一个Ckernel的对象 6、创建一个回收的槽函数 7、添加界面文件 8、创建一个私有的界面对象 9、修改为使用单例模式的控制类创建界面 10、在Ckernel类中…...

微信小程序怎么分包步骤(包括怎么主包跳转到分包)

第一步 主包跳转到分包 第一步 第二步...

点云配准控制迭代停止的阈值

在点云配准&#xff08;如ICP算法&#xff09;中&#xff0c;setEuclideanFitnessEpsilon() 是一个设置收敛条件的函数&#xff0c;用于控制迭代停止的阈值。以下是关于该参数的详细说明&#xff1a; 函数作用 setEuclideanFitnessEpsilon() 设置的是 两次连续迭代之间均方误…...

高频面试题:Android MVP/MVVM/MVI这几种架构在实际生产中,各自的优缺点和适用场景是什么

安卓开发早期的架构模式相对简单&#xff0c;许多开发者直接在Activity或Fragment中堆砌业务逻辑和UI操作&#xff0c;这种方式虽然在小型项目中看似高效&#xff0c;但随着代码量的增加&#xff0c;很快就会导致逻辑混乱、难以测试和维护的问题。Activity和Fragment作为安卓框…...

国内主要半导体厂家

以下是国内主要半导体厂家按产品类别&#xff08;模拟、数字、MCU、功率、传感器等&#xff09;的分类总结&#xff0c;涵盖各领域代表企业及其核心产品方向&#xff1a; ​一、模拟芯片&#xff08;Analog IC&#xff09;​​ ​圣邦微电子&#xff08;SGMICRO&#xff09;​​…...

DeepSeek深度观察:白宫“炒人“威胁的语义强度与市场应激量化分析

一、AI观察&#xff1a;政治博弈的语义强度分析 通过NLP情感分析模型对特朗普近期公开言论的语义解析显示&#xff0c;总统在社交媒体及记者会中多次使用"立即解雇""卷铺盖走人"等极端表述&#xff0c;其公开威胁解雇鲍威尔的推文互动量突破120万次&#…...