C++未定义行为和异常处理

C++未定义行为和异常处理

c++ 复制代码
#include <iostream>

int main() {
    int* p = nullptr;
    try {
        std::cout << *p; 
    } catch (...) {
        std::cout << "Caught an exception!";
    }
    return 0;
}

q1:代码会输出什么?

a:Linux上,通常会收到一个"段错误 (Segmentation fault)"的提示;

解析:未定义行为

根源:未定义行为 (Undefined Behavior, UB)

  1. 这里的 p 是一个空指针 (nullptr)
  2. 根据C++标准,解引用一个空指针是 未定义行为
  3. **未定义行为:**意味着C++标准没有规定此时程序必须做什么。编译器可以假定这种行为永远不会发生,并基于此进行优化。在运行时,任何事情都可能发生,包括但不限于:
    1. 程序立即崩溃
    2. 程序继续运行,但输出一个垃圾值
    3. 程序表现出完全不相关的奇怪行为

分析:

  1. 大多数现代操作系统(如Windows, Linux, macOS)上,内存地址0(空指针所指向的地址)受到操作系统的保护,任何用户程序都无权访问
  2. *p 尝试读取该地址的数据时,CPU会触发一个硬件级别的保护错误。操作系统会捕获这个错误,并向该程序发送一个信号(如 SIGSEGV,即段错误信号),强制终止该程序的执行

try...catch

try...catch只能捕获通过 throw 关键字抛出的C++异常

  1. C++异常 :是一种程序内部的、由软件定义的控制流机制。当代码执行 throw std::runtime_error("错误信息"); 时,一个std::runtime_error类型的异常对象被创建并抛出,然后由匹配的catch块来捕获和处理
  2. 段错误 (Segmentation Fault) :这不是一个C++异常。它是一个由操作系统发出的底层信号,通知进程其访问了非法内存。这个事件发生在C++运行时系统之外,因此C++的try...catch机制无法捕获它

How to understand:

  1. try...catch 是程序内部处理"计划内意外"(如文件找不到、网络中断)的流程。
  2. 而解引用空指针导致的崩溃,则像是房子地基塌了,属于结构性毁灭,内部的应急预案(try...catch)根本来不及反应
相关推荐
AOwhisky3 分钟前
Linux(CentOS)系统管理入门笔记(第十四期)——计划任务与进程调度管理:atcron 与 nicechrt
linux·运维·笔记·centos·云计算·进程调度·计划任务
小莫分享15 分钟前
sshw:用交互搜索和 Web 配置高效管理 SSH Server
linux·运维·golang·开源·ssh
流浪0011 小时前
Linux系统22:——文件(六):目标文件与ELF深度解析:从编译到加载的全景揭秘
linux·运维·服务器
明日清晨1 小时前
VS2022禁用 NRVO/返回值优化(不调用拷贝构造函数处理方式)
c++
kidwjb1 小时前
Linux内核-内核信号处理函数
linux·内核·信号处理
阿米亚波1 小时前
【C++ STL】std::array
java·开发语言·c++
choumin1 小时前
结构型模式——组合模式
c++·设计模式·组合模式·结构型模式
其实防守也摸鱼1 小时前
镜像校验完成iso完整操作流程(Windows 环境,适配 Ubuntu 22.04 / 24.04)
linux·服务器·windows·学习·ubuntu·教程
努力努力再努力wz2 小时前
【分布式系统与 RPC 框架系列】从单机瓶颈到远程调用:一文理解分布式架构与 RPC 原理
linux·网络·c++·分布式·网络协议·rpc·架构
神仙别闹2 小时前
基于C++实现(控制台)景区旅游管理系统
开发语言·c++·旅游