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

C++产生未定义的行为的原因分析

前言

最近一直在做QT开发,编程环境是VS2017和QT5.11.2

经常遇到的问题就是,在VS中调试程序,前面都是正常运行的,但是当关闭窗口,退出程序的时候,VS会抛出一个异常 “未加载ntdll.pdb,触发了一个断点” ,“未加载ucrtbase.pdb,0x00007FF8E2F1DF28 (ucrtbase.dll) (Test.exe 中)处有未经处理的异常: 将一个无效参数传递给了将无效参数视为严重错误的函数” 等等类似的未加载xxx.pdb的错误。
在这里插入图片描述

这种错误产生的原因就是由于发生了未定义的行为。

未定义行为

  • 未定义的行为是什么?
    在C++(以及其他编程语言)中,“未定义的行为”(Undefined Behavior,简称 UB)是指语言标准没有为某些代码行为提供明确的规范或定义,因此编译器不必为这种行为提供任何特定的支持或保证。
    当代码触发未定义的行为时,可能会发生以下情况之一(或更多):
    • 程序崩溃:例如,通过无效指针引用内存;
    • 不可预测的输出:程序可能会产生意外的结果;
    • 随机行为:程序在不同的运行或在不同的平台上可能表现不同;
    • 安全漏洞:攻击者可能会利用未定义的行为来执行恶意操作;
    • 似乎“正常”工作:有时,未定义的行为可能不会立即显现出任何问题,但这不意味着问题不存在。在不同的情况、不同的编译器优化级别或不同的平台上,问题可能会突然显现。
  • 一些常见的引起未定义行为的操作包括:
    • 解引用空指针;
    • 访问越界的数组元素;
    • 读取未初始化的变量;
    • 对一个对象使用 delete 多次;
    • 整数溢出(在某些情况下,例如有符号整数)。

产生原因以及解决

现在我说下我遇到的产出未定义行为的两个原因以及解决方法。

原因一:尝试删除同一个实例两次

我在代码中使用了QT的第三方库QWT,我在给我的qwtPlot设置坐标轴的时候,使用了下面的语句。

QwtLinearScaleEngine* scaleEngine = new QwtLinearScaleEngine();
scaleEngine->setAttribute(QwtScaleEngine::Floating);
ui->qwtPlot->setAxisScaleEngine(QwtPlot::xBottom, scaleEngine);
ui->qwtPlot->setAxisScaleEngine(QwtPlot::yLeft, scaleEngine);

这样会产生一个异常:
在这里插入图片描述
产生的原因是:
我为代码中的 Qwt 创建了一个新的 QwtLinearScaleEngine 并设置了其属性,然后将其设置为 qwtPlot 的两个轴(xBottom 和 yLeft)的比例尺引擎。问题在于我为两个不同的轴使用了相同的比例尺引擎实例。当 qwtPlot 在程序结束或其析构函数中被销毁时,它将尝试删除与其关联的资源。这意味着它可能会尝试删除同一个 scaleEngine 实例两次,这会导致未定义的行为。

解决的方法也很简单:
让两个坐标轴使用不同的比例尺引擎实例即可。

QwtLinearScaleEngine* scaleEngine1 = new QwtLinearScaleEngine();
QwtLinearScaleEngine* scaleEngine2 = new QwtLinearScaleEngine();
scaleEngine1->setAttribute(QwtScaleEngine::Floating);
scaleEngine2->setAttribute(QwtScaleEngine::Floating);
ui->qwtPlot->setAxisScaleEngine(QwtPlot::xBottom, scaleEngine1);
ui->qwtPlot->setAxisScaleEngine(QwtPlot::yLeft, scaleEngine2);

成功解决问题。

原因二:使用fclose关闭一个“ nullptr” 文件指针

我在代码中定义了一个文件指针FILE* fp,并且初始化为nullptr

FILE* fp = nullptr;

在析构函数中,我直接使用fclose(fp)来关闭了这个文件指针,这样在退出程序时会产生异常:
在这里插入图片描述
产生的原因是:
在 C 标准库中,尝试使用 fclose 关闭一个 nullptr 文件指针是未定义的行为。C标准文档并没有明确指定在这种情况下应该发生什么,所以结果可能因编译器和平台而异。在某些实现中,这样做可能不会有任何明显后果,而在其他实现中,它可能会导致运行时错误(如上所示)。这与 delete 在 C++ 中的行为不同。在 C++ 中,尝试删除一个 nullptr 指针是明确定义为安全的无操作。但在 C 的 fclose 函数中,这种行为没有明确定义,所以应该避免。

解决方法:
在关闭这个文件指针时,先判断是否为空。

if (fp != nullptr)
{fclose(fp);fp = nullptr;
}

完美解决。

为了写出健壮和可靠的代码,开发者应尽量避免触发未定义的行为。这通常需要对编程语言的规范和相关的库有深入的了解,以及使用各种工具(如静态分析器、内存检查器如 Valgrind、fuzz 测试工具等)来检测和避免潜在的问题。

相关文章:

C++产生未定义的行为的原因分析

前言 最近一直在做QT开发,编程环境是VS2017和QT5.11.2 经常遇到的问题就是,在VS中调试程序,前面都是正常运行的,但是当关闭窗口,退出程序的时候,VS会抛出一个异常 “未加载ntdll.pdb,触发了一…...

C++ Qt QString类用法介绍

QString 是 Qt 框架中的一个重要类,用于处理 Unicode 字符串。它提供了大量的功能,方便开发者处理、查询和操作字符串。以下是 QString 的一些常用功能和示例: 构造和初始化 QString s1; // 默认构造函数,创建一个空字符串 QStr…...

亚马逊测评关于IP和DNS的问题

最近不少人询问了关于IP和DNS的问题,在此进行一些科普。 当客户端试图访问一个网站时,首先会向其所在的ISP的DNS服务器进行查询。如果ISP的DNS服务器没有相关缓存,则会向上级DNS服务器进行查询。 一些诸如CDN之类的服务,可能会为…...

新增Node.js运行环境、新增系统缓存清理功能,1Panel开源面板v1.7.0发布

2023年10月16日,现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.7.0版本。 在这个版本中,1Panel新增Node.js运行环境;新增系统缓存清理功能;应用安装时支持选择远程数据库。此外,我们进行了40多项功能更新和…...

【SA8295P 源码分析 (一)】60 - QNX Host 如何新增 android_test 分区给 Android GVM 挂载使用

【SA8295P 源码分析】60 - QNX Host 如何新增 android_test 分区给 Android GVM 挂载使用 一、QNX 侧:创建分区、配置下载、配置透传1.1 修改分区表,新增 android_test 分区,大小为 2GByte1.2 下载 android_test.img 镜像1.3 配置 /dev/disk/android_test_a 分区透传到 Andr…...

天津滨海新区城市轨道交通电能管理系统方案与实施方案

【摘要】:介绍天津滨海新区轨道交通项目建设电能管理系统的系统架构、功能组成和实施方案。在借鉴其他城市轨道交通项目电能管理系统的基础上,结合天津滨海新区轨道交通建设的具体情况,对系统组网方案、测量表计设置原则、与通风空调节能系统和照明节能系…...

torch.cat 使用小节

torch.cat 使用小节 torch.cat 要求在所指定拼接维度之外的所有维度都要匹配,例如 import torch v1 torch.tensor([[1, 2, 3], [4, 5, 6], [4, 5, 6]]) # 3*3 v2 torch.tensor([[3, 6, 8]]) # 1*3 torch.cat([v1, v2], dim1)运行之后会报错 Sizes of tensors…...

Java:SpringBoot整合Spring Batch示例

目录 文档基础概念Tasklet方式示例Chunk方式示例参考文章 文档 https://docs.spring.io/spring-batch/docs/4.3.9/reference/html/index.html 基础概念 JobLauncher:作业启动器,启动作业的入口。对应的实现类为SimpleJobLauncher。Job:作业…...

Windows + Msys 下编译 TensorFlow 2.14

安装基本工具 pacman -S --needed zip unzip patch diffutils git 下载安装 Windows 版本 bazel 6.1.2,复制到 C:/Windows/system32 目录下,改名为 bazel.exe wget https://github.com/bazelbuild/bazel/releases/download/6.1.2/bazel-6.1.2-window…...

百度发布全新 AI 互动式搜索:百度简单搜索

本心、输入输出、结果 文章目录 百度发布全新 AI 互动式搜索:百度简单搜索前言主要能力 相关资料能力介绍 百度搜索升级发文告用户如何获取百度简单搜索百度简单搜索的定位百度简单搜索在 APP 上面的体验讨论和点评我们关注的几个问题 弘扬爱国精神 百度发布全新 AI…...

VUE开发记录

记录vue开发中遇到的问题 - 2023/10/16 问题:项目element-ui表单中,input点击需要打开弹框,弹框选择值后回填到input,但是此时elementUI的校验出错(值存在却校验为空) 解决方法: this.employee…...

2023年中国乳胶制品产量、需求量及市场规模分析[图]

乳胶泛指聚合物微粒分散于水中形成的胶体乳液,又称胶乳。习惯上将橡胶微粒的水分散体称为胶乳,而将树脂微粒的水分散体称为乳液。以乳胶为原料制成的制品称乳胶制品,常见的如海绵、手套、玩具、胶管等。 我国乳胶制品细分主要分为避孕套、乳胶…...

手撕Vue-数据驱动界面改变上

经过上一篇的介绍,已经实现了监听数据的变化,接下来就是要实现数据变化后,界面也跟着变化,这就是数据驱动界面改变。 想要实现数据变化之后更新UI界面,我们可以使用发布订阅模式来实现,先定义一个观察者类,…...

for循环中循环一次提交一次 insert update 关闭事务 spring springboot mybatis

省流: 在方法上直接加如下注解: Transactional(propagation Propagation.NOT_SUPPORTED) public void t1(){//业务代码 } 正文: 在测试的时候,有时候会希望在for循环中,代码循环一次就提交一次事务。 方法一&#…...

VS2010 C语言内嵌汇编语言程序

VS2010 C语言内嵌汇编语言程序 2021年7月28日席锦 在visual studio 2010中C语言使用内联汇编写代码 ,它的格式有两种, 一种是__asm 直接接汇编指令语句,比如:__asm int 3 // 软件中断 另一种是加上花括号,类似于一个函数&…...

【TES720D】青翼科技基于复旦微的FMQL20S400全国产化ARM核心模块

板卡概述 TES720D是一款基于上海复旦微电子FMQL20S400的全国产化核心模块。该核心模块将复旦微的FMQL20S400(兼容FMQL10S400)的最小系统集成在了一个50*70mm的核心板上,可以作为一个核心模块,进行功能性扩展,特别是用…...

css 左右滚轮无缝衔接

最近的项目有做到一个功能 类似跑马灯或者公告栏那种 有文字 也有列表的 所以 写了两种 第一种公告栏文字是用的js 第二种图文类型是用的css 两种方法 记录一下 第一种 纯文字滚动 其实也是根据js去计算dom的宽度 通过js去给css赋值 <div class"div1"><div …...

Hadoop分布式文件系统-HDFS

1.介绍 HDFS (Hadoop Distributed File System)是 Hadoop 下的分布式文件系统,具有高容错、高吞吐量等特性,可以部署在低成本的硬件上。 2.HDFS 设计原理 2.1 HDFS 架构 HDFS 遵循主/从架构,由单个 NameNode(NN) 和多个 DataNode(DN) 组成:...

专业图表绘制软件 OmniGraffle Pro mac v7.22.1中文版软件介绍

OmniGraffle Pro mac是一款Mac平台上的专业绘图软件&#xff0c;主要用于创建各种图形&#xff0c;包括流程图、组织结构图、网络拓扑图、UI原型等。该软件提供了强大的绘图工具和丰富的样式库&#xff0c;可以让用户快速创建出高质量的图形&#xff0c;并支持导入和导出各种常…...

Git 本地文件合并和恢复

前记&#xff1a; git svn sourcetree gitee github gitlab gitblit gitbucket gitolite gogs 版本控制 | 仓库管理 ---- 系列工程笔记. Platform&#xff1a;Windows 10 Git version&#xff1a;git version 2.32.0.windows.1 Function&#xff1a; Git 本地文件合并和恢复…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...