0

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

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

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

(我担心 RTFM 的答案,但摸不着头脑)


像这样的东西怎么样:

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

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

4

2 回答 2

1

是的,在这种情况下 valgrind 仍然有用。C++(即使使用 Qt)仍然不是垃圾收集语言,因此您仍然可能意外泄漏内存。在您提供的示例代码中,QFile 将泄漏,因为没有任何东西会破坏它(通过使用删除运算符)。

Qt 确实提供了一种方法来帮助清理任何 QObject 派生类。但是,您仍然需要将正确的对象作为父对象传递,以便清理工作。

此外,valgrind 还将帮助识别对未初始化或已释放内存的任何不正确使用。

于 2013-10-09T06:35:33.887 回答
1

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

这是非常重要的细节破坏和删除子代的是破坏父代。父级可能是一个自动变量,然后在离开作用域时自动释放内存。如果使用 将父级分配在免费存储上,那么您就会发生内存泄漏,除非:new

  1. 您手动delete设置父级。
  2. 您使用智能指针。

一般来说,应该避免在 C++ 中使用裸指针。Qt 提供了一个QSharedPointer与 C++11's 基本等效的std::shared_ptra ,以及一个QScopedPointer与 C++11's 基本等效的a std::unique_ptr。除非您的测量结果表明手动内存管理会在性能或内存开销方面为您赢得一些东西,否则请使用它们。这些智能指针为您执行异常安全的内存管理。

我认为您会从阅读 Strostrup 的“The C++ Programming Language”第 4 版中受益。它更深入地介绍了这些概念。

于 2013-10-10T17:46:24.493 回答