我习惯使用 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
将父级分配到自由存储区,您就会遇到内存泄漏,除非:
- 您手动
删除
父项。 - 你使用智能指针。
一般来说,在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/