c++ - Qt Creator/C++ 在这种情况下 valgrind 是否有意义

标签 c++ memory-management memory-leaks

我习惯使用 valgrind 来调试我的 C 代码,但我最近切换到 Qt Creator 和 C++。 Qt Creator 内置了 valgrind,听起来不错但是......

如果我不直接 malloc/free 内存(即仅在不再引用对象时使用 C++ 的内置内存清理),难道内存泄漏是不可能的吗?

如果 C++ 正在管理对象和内存,我怎么会导致内存泄漏....

(我害怕 RTFM 的回答,但挠头)


像这样的事情怎么样:

m_logFile = new QFile(programSettings->logging_filename());

我是否必须释放此指针指向的内容,或者当 m_logFile 不再指向有效对象时是否会释放内存? (因为我在这里使用"new",所以我想知道它的工作方式是否不同)

最佳答案

Qt 的内存管理仅对 QObject 层次结构是自动的,其中父对象拥有子对象。只要你销毁 parent ,所有的 child 都会被删除。这当然适用于 QWidgets,因为它们是 QObject。从技术上讲,您可以让 QObject 成为 QWidget 的父级,但它打破了小部件对其父级的假设,所以不要这样做。 QWidget 当然可以拥有 QObject

这是非常重要的细节:销毁父级销毁和删除子级。 parent 可能是一个自动变量,然后在离开作用域时自动释放内存。如果使用 new 将父级分配到自由存储区,您就会遇到内存泄漏,除非:

  1. 您手动删除父项。
  2. 你使用智能指针。

一般来说,在C++中应该避免使用裸指针。 Qt 提供了一个 QSharedPointer,它主要等同于 C++11 的 std::shared_ptr,以及一个 QScopedPointer,它主要等同于 C++11 的 std::unique_ptr。除非您有测量显示手动内存管理会在性能或内存开销方面为您赢得一些东西,否则请使用它们。这些智能指针为您执行异常安全的内存管理。

我认为您会从阅读 Stroprup 的“C++ 编程语言”第 4 版中获益。它更深入地介绍了这些概念。

关于c++ - Qt Creator/C++ 在这种情况下 valgrind 是否有意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19263253/

相关文章:

c++ - ESP32和Kotlin服务器之间的套接字延迟不一致

c++ - 纠正 C++ 中的异常

windows - 监视 Windows 内存映射文件

javascript - 简单的 nodejs 应用程序中的内存泄漏

ios - 使用 Swift 获取核心数据请求中的内存泄漏

c++ - 当一个线程正在执行make_shared时,另一个线程是否可以做一些事情导致make_shared通过new创建的对象泄漏?

c++ - 如何从模板类方法中调用已定义类的方法

c - 使用 malloc 在 C 中进行序列化

iphone - 诊断自动释放错误(EXC_BAD_ACCESS)

android - 如何解决自定义 View 中的内存泄漏?