一、Qt 内存泄漏常见原因

  1. QObject 堆对象未指定父对象,未手动 delete;
  2. 重复创建对象、循环引用;
  3. 动态库、第三方库内存未释放。

二、Valgrind 排查工具(Linux/macOS)

Windows 可搭配 Visual Leak Detector,Linux/macOS 首选 Valgrind。

  1. 安装:sudo apt install valgrind
  2. 运行检测:

bash

运行

valgrind --leak-check=full ./AppName
  1. 关键字解读:
    • definitely lost确定泄漏,必须修复;
    • indirectly lost:间接泄漏,跟随上面一并修复。

说明:Qt 框架自身少量内存为框架缓存,可忽略。


三、Qt 智能指针使用

1. QPointer(弱指针,监视 QObject)

对象销毁后自动置空,防止野指针。

cpp

运行

QPointer<QWidget> ptr(new QWidget);
if(ptr) ptr->show();
2. QSharedPointer 共享智能指针(引用计数)

自动管理生命周期,无需手动 delete。

cpp

运行

QSharedPointer<QWidget> sp(new QWidget);
sp->show();

四、Qt 内存最佳实践

  1. 界面控件优先使用父子内存管理,创建时传入 parent;
  2. 独立堆对象使用智能指针;
  3. 非模态窗口开启 WA_DeleteOnClose
  4. 定期用 Valgrind 做泄漏检测。


小结

开发阶段养成良好内存写法,上线前用 Valgrind 完整检测,双方案结合彻底解决内存泄漏。

Logo

更多推荐