以下のC++コードを実装した後、valgrind --leak-check=full
メモリリークがないかどうかを確認するために実行しました。その結果、終了時に0バイトが使用され、リークは発生し ませんでした。
しかし、後で、デストラクタの内部ではdelete[] x
なく、使用するのを忘れていることに気付きました。delete x
いくつかの説明(たとえば、C++のdeletevs delete []演算子)を検索しましたが、配列の最初のオブジェクトのデストラクタのみを呼び出すため、delete
withoutを使用するとメモリリークが発生する可能性があると読みました。[]
コードを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;
}