new []和delete会自动调用类的构造和析构。
析构只需要负责释放自己new的就好,不需要管下一级调用。

先看懂弹窗: SIGSTOP

SIGSTOP 不是崩溃报错!
含义:操作系统把程序暂停挂起,不是程序出错崩溃。GDB调试器收到这个信号就停住,跳到汇编 free 函数。

为什么会弹出SIGSTOP、跳到free汇编

GDB默认会拦截 SIGSTOP 信号,一旦触发就中断程序,跳到底层libc汇编代码( free / plt ),看起来像是程序崩了,实际程序只是被暂停。
常见两种场景:

  1. 程序本身正常运行,GDB捕获SIGSTOP,中断调试(最常见)
  2. 程序执行内存释放操作的时候,收到系统暂停信号,中断在 free 函数内部汇编。

区分重点:

  • SIGSEGV :段错误,真正崩溃(内存越界、野指针、重复delete)
  • SIGSTOP :系统暂停进程,不是崩溃

快速解决办法(QtCreator里配置GDB,忽略SIGSTOP)

  1. QtCreator → 工具 → 选项 → 调试器 → GDB
  2. 在「额外GDB命令」输入下面两行:

plaintext

handle SIGSTOP nopass nostop
handle SIGTSTP nopass nostop

  1. 点击确定,重启调试。

作用:告诉GDB:收到SIGSTOP信号不要中断、不要暂停程序,直接放行。

测试:先把所有自定义结构体代码全部注释,只保留截图里最简main.cpp,重新调试。
✅ 如果注释之后不再弹出SIGSTOP中断:说明你的结构体代码有内存错误(重复释放/野指针)
✅ 如果注释后依旧弹出SIGSTOP:100%就是GDB信号拦截问题,用上面GDB命令解决。

补充小知识点

  • SIGSTOP:由 kill -STOP pid 触发,或者调试器内部机制触发,进程冻结; SIGCONT 恢复运行。
  • 控制台程序,Pro配置参考
    QT += core
    CONFIG += consoleCONFIG -= app_bundleTEMPLATE = appSOURCES += main.cpp
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐