2013-10-09 47 views
0

我習慣於使用valgrind來調試我的C代碼,但我最近切換到Qt Creator和C++。 Qt Creator的valgrind內置了哪個聲音不錯,但...Qt Creator/C++在這種情況下valgrind有意義

如果我不直接使用malloc /可用內存(即只使用C++的內置內存清除功能,不需要更多引用對象),不應該發生內存泄漏不可能?

我怎麼可能會導致內存泄漏,如果C++是管理對象和內存....

(我害怕RTFM答案,但撓頭)


什麼這樣的事情:

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

我將不得不釋放一下這個指針指向,或當m_logFile不再指向有效的對象將內存被釋放? (因爲我在這裏使用'新',我不知道它是否工作不同)

+0

庫本身可能有一些內存泄漏(如果你使用Qt,一些返回的東西需要你明確地釋放它們IIRC)。 –

+0

不存在你'刪除'這是一個內存泄漏。每個'new'必須有一個匹配的'delete',否則就是內存泄漏。避免內存泄漏的方法不是使用指針。 – john

+0

Qt的做事方式似乎是讓你在(通常是QObject繼承)類中分配的類的析構函數中釋放(用'delete')。 –

回答

1

Qt的內存管理僅在QObject層次結構中自動執行,其中父項擁有子項。只要你破壞父母,所有的孩子都會被刪除。這當然適用於QWidgets,因爲它們是QObject s。從技術上講,你可以讓QObject成爲QWidget的父母,但它打破了小工具對父母的假設,所以不要這樣做。 A QWidget當然可以擁有QObject s。

這裏的非常重要的細節:這是父的破壞自毀和刪除孩子。父級可能是一個自動變量,然後內存在離開該範圍時自動解除分配。如果父母是在使用new自由存儲分配的,你也得爲自己內存泄漏,除非:

  1. 您手動delete父。
  2. 您使用智能指針。

一般來說,應該避免在C++中使用裸指針。 Qt提供了一個QSharedPointer,它大部分等價於C++ 11的std::shared_ptrQScopedPointer,它們大部分等價於C++ 11的std::unique_ptr。使用它們,除非你有測量結果表明手動內存管理將在性能或內存開銷方面爲你贏得一些東西。這些智能指針爲您執行異常安全的內存管理。

我想你會受益於閱讀Strostrup的「The C++ Programming Language」,第4版。它更深入地介紹了這些概念。

1

是的,在這種情況下valgrind仍然有用。 C++(即使是Qt)仍然不是垃圾收集語言,所以你仍然可能意外地泄漏了內存。在你給出的代碼示例中,QFile將會泄漏,因爲沒有東西會破壞它(通過使用delete操作符)。

Qt確實提供了一種方法來幫助清理任何QObject派生類。但是,您仍然需要將正確的對象作爲父對象進行清理才能工作。

此外,valgrind還將幫助識別未初始化或已釋放內存的任何不正確用法。

相關問題