Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt-Creator/C++;valgrind在这种情况下有意义吗 我习惯于用ValGReND调试我的C代码,但我最近切换到Qt Creator和C++。Qt Creator内置了valgrind,听起来不错,但_C++_Memory Management_Memory Leaks - Fatal编程技术网

Qt-Creator/C++;valgrind在这种情况下有意义吗 我习惯于用ValGReND调试我的C代码,但我最近切换到Qt Creator和C++。Qt Creator内置了valgrind,听起来不错,但

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”,我想知道它的

如果我不直接malloc/释放内存(即,在不再引用对象的情况下只使用C++内置的内存清理),内存泄漏难道不可能吗

<> >如果C++管理对象和内存,我怎么会导致内存泄漏?

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


像这样的东西怎么样:

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
在空闲存储区上分配父存储区,则会导致内存泄漏,除非:

  • 您可以手动
    删除父项
  • 您使用智能指针
  • 一般来说,在C++中使用裸露指针是应该避免的。Qt提供了一个
    QSharedPointer
    ,它主要相当于C++11的
    std::shared_ptr
    ,以及一个
    QScopedPointer
    ,它主要相当于C++11的
    std::unique_ptr
    。使用它们,除非您的测量结果表明,手动内存管理可以在性能或内存开销方面为您赢得一些东西。这些智能指针为您执行异常安全内存管理


    我想你会从阅读Strostrup的《C++程序设计语言》第四版获益。它更深入地介绍了这些概念。

    库本身可能存在一些内存泄漏(如果您使用的是Qt,一些返回的内容需要您显式地释放它们IIRC)。除非您
    删除
    ,否则这是内存泄漏。每个新的
    必须有一个匹配的
    delete
    ,否则就是内存泄漏。避免内存泄漏的方法不是使用指针。Qt的做法似乎是释放(使用
    delete
    )您在(通常是QObject继承)类中分配的类的析构函数中的内容。