執行下面的C++代碼後,我運行valgrind --leak-check=full
以檢查是否有任何內存泄漏。結果是0字節在出口和處使用,沒有泄漏是可能的。Valgrind不會在「刪除陣列」上報告內存泄漏
但是,後來我發現我忘了在析構函數裏面使用delete[] x
而不是delete x
。
我搜索了一些解釋(例如:delete vs delete[] operators in C++),我讀到的一切說使用delete
沒有[]
可能會導致內存泄漏,因爲它要求只是爲數組中的第一個對象的析構函數。
我改變了代碼刪除[]和Valgrind輸出是相同的(如預期)。但是現在我很困惑:「valgrind有沒有問題,或者delete
真的可以正常工作,即使沒有運營商[]
?
#include <iostream>
#include <string.h>
using namespace std;
class Foo {
private: char *x;
public:
Foo(const char* px) {
this->x = new char[strlen(px)+1];
strcpy(this->x, px);
}
~Foo() {
delete x;
}
void printInfo() { cout << "x: " << x << endl; }
};
int main() {
Foo *objfoo = new Foo("ABC123");
objfoo->printInfo();
delete objfoo;
return 0;
}
您提到的問題的答案沒有提及內存泄漏。事實上,他們說的和阿爾斯在下面說的一樣。那麼你爲什麼說*「我讀過的所有內容都表示,如果不使用[],則會導致內存泄漏。」*? –
另外,在你的程序標誌上使用valgrind 3.2.1,有一個'不匹配的free()/ delete/delete []'。這不是內存泄漏,但它是一個錯誤。 –
據瞭解,例如,當數組包含'char'等內置類型時,MSVC恰好爲'delete x'和'delete [] x'生成相同的代碼。該代碼對於具有析構函數的類類型是*不同*。 –