Qt-Creator/C++;valgrind在这种情况下有意义吗 我习惯于用ValGReND调试我的C代码,但我最近切换到Qt Creator和C++。Qt Creator内置了valgrind,听起来不错,但
如果我不直接malloc/释放内存(即,在不再引用对象的情况下只使用C++内置的内存清理),内存泄漏难道不可能吗 <> >如果C++管理对象和内存,我怎么会导致内存泄漏? (我害怕RTFM的回答,但我只是挠头)Qt-Creator/C++;valgrind在这种情况下有意义吗 我习惯于用ValGReND调试我的C代码,但我最近切换到Qt Creator和C++。Qt Creator内置了valgrind,听起来不错,但,c++,memory-management,memory-leaks,C++,Memory Management,Memory Leaks,如果我不直接malloc/释放内存(即,在不再引用对象的情况下只使用C++内置的内存清理),内存泄漏难道不可能吗 >如果C++管理对象和内存,我怎么会导致内存泄漏? (我害怕RTFM的回答,但我只是挠头) 像这样的东西怎么样: m_logFile = new QFile(programSettings->logging_filename()); 我是否必须释放这个指针指向的对象,或者当m_logFile不再指向有效对象时,内存是否会被释放?(因为我在这里使用了“new”,我想知道它的
像这样的东西怎么样:
m_logFile = new QFile(programSettings->logging_filename());
我是否必须释放这个指针指向的对象,或者当m_logFile不再指向有效对象时,内存是否会被释放?(因为我在这里使用了“new”,我想知道它的工作原理是否不同)是的,在这种情况下,valgrind仍然有用。C++(即使使用QT)仍然不是垃圾收集语言,所以你仍然可以意外地泄漏内存。在您给出的示例代码中,QFile将泄漏,因为没有任何东西会破坏它(通过使用delete操作符) Qt确实提供了一种方法来帮助清理任何QObject派生类。但是,您仍然需要将正确的对象作为父对象传递,以便进行清理
此外,valgrind还将帮助识别未初始化或已释放内存的任何不正确使用。Qt的内存管理仅对父级拥有子级的
QObject
层次结构自动进行。只要您破坏父级,所有子级都将被删除。这当然适用于QWidgets
,因为它们是QObject
s。从技术上讲,您可以让一个QObject
成为QWidget
的父对象,但它打破了widget对其父对象的假设,所以不要这样做。QWidget
当然可以拥有QObject
s
这里有一个非常重要的细节:是父级的破坏导致了子级的破坏和删除。父级可能是一个自动变量,然后在离开作用域时自动释放内存。如果使用new
在空闲存储区上分配父存储区,则会导致内存泄漏,除非:
删除父项
QSharedPointer
,它主要相当于C++11的std::shared_ptr
,以及一个QScopedPointer
,它主要相当于C++11的std::unique_ptr
。使用它们,除非您的测量结果表明,手动内存管理可以在性能或内存开销方面为您赢得一些东西。这些智能指针为您执行异常安全内存管理
我想你会从阅读Strostrup的《C++程序设计语言》第四版获益。它更深入地介绍了这些概念。库本身可能存在一些内存泄漏(如果您使用的是Qt,一些返回的内容需要您显式地释放它们IIRC)。除非您
删除,否则这是内存泄漏。每个新的必须有一个匹配的delete
,否则就是内存泄漏。避免内存泄漏的方法不是使用指针。Qt的做法似乎是释放(使用delete
)您在(通常是QObject继承)类中分配的类的析构函数中的内容。