Valgrind nie zgłasza przecieku pamięci w „usuń tablicę”
Po zaimplementowaniu poniższego kodu C ++ uruchomiłemvalgrind --leak-check=full
w celu sprawdzenia, czy nie było wycieku pamięci. Wynik był0 bajtów było używanych przy wyjściu iżadne wycieki nie są możliwe.
Jednak później odkryłem, że zapomniałem użyćdelete[] x
zamiast po prostudelete x
wewnątrz destruktora.
Szukałem pewnych wyjaśnień (na przykład:operatory delete vs delete [] w C ++), a wszystko, co przeczytałem, mówi to za pomocądelete
bez[]
może spowodować wyciek pamięci, ponieważ wywołuje tylko destruktor dla pierwszego obiektu w tablicy.
Zmieniłem kod do usunięcia [], a wyjście valgrind było takie samo (zgodnie z oczekiwaniami). Ale teraz jestem zdezorientowany:„Czy istnieje problem z valgrind lub robidelete
naprawdę działa dobrze dla tablic nawet bez operatora[]
?
#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;
}