我习惯使用valgrind来调试我的C代码,但最近我转而使用Qt Creator和C ++。 Qt Creator内置valgrind听起来不错但是......
如果我不直接使用malloc / free内存(即只在不再引用对象时使用C ++的内置内存清理),那么内存泄漏是不是不可能?
如果C ++管理对象和内存,我怎么能导致内存泄漏....
(我担心RTFM答案,但是抓头)
这样的事情:
m_logFile = new QFile(programSettings->logging_filename());
我必须释放此指针指向的内容,或者当m_logFile不再指向有效对象时,是否会释放内存? (因为我在这里使用'new',我想知道它是否有所不同)
答案 0 :(得分:1)
是的,在这种情况下,valgrind仍然有用。 C ++(即使使用Qt)仍然不是垃圾收集语言,因此您仍然可能意外泄漏内存。在您给出的示例代码中,QFile将泄漏,因为没有任何东西会破坏它(通过使用delete运算符)。
Qt确实提供了一种方法来帮助清理任何QObject派生类。但是,您仍然需要将正确的对象作为父对象传递以进行清理。
此外,valgrind还将帮助识别未初始化或释放内存的任何错误使用。
答案 1 :(得分:1)
Qt的内存管理仅对QObject
层次结构自动进行,其中父级拥有子级。只要你破坏了父母,所有的孩子都会被删除。这当然适用于QWidgets
,因为它们是QObject
。从技术上讲,你可以只让一个QObject
成为QWidget
的父级,但它会打破小部件对父母的假设,所以不要这样做。 QWidget
当然可以拥有QObject
s。
这是非常重要的细节:它是破坏和删除子项的父级的销毁。父可以是自动变量,然后在离开范围时自动释放存储器。如果使用new
在免费商店中分配父级,则除非出现内存泄漏:
delete
父母。一般来说,应该避免在C ++中使用裸指针。 Qt提供的QSharedPointer
大致相当于C ++ 11的std::shared_ptr
,而QScopedPointer
大致相当于C ++ 11的std::unique_ptr
。使用它们,除非您已经测量显示手动内存管理将在性能或内存开销方面赢得一些东西。这些智能指针为您执行异常安全的内存管理。
我想你会从阅读Strostrup的“The C ++ Programming Language”第4版中受益。它更深入地介绍了这些概念。