Jaka jest różnica między operatorami delete
i delete[]
w C ++?
c++
memory-management
delete-operator
shreyasva
źródło
źródło
vector<>
zamiast tablicy, kiedy tylko mogę.std::unique_ptr<int>(new int[3])
Ponieważ wywoła regularnedelete
na tablicy, co jest niezdefiniowanym zachowaniem. Zamiast tego musisz użyćstd::unique_ptr<int[]>
Odpowiedzi:
delete
Operator zwolni pamięć i wywołuje destruktor dla pojedynczego obiektu utworzonegonew
.delete []
Operator zwolni z pamięcią i żądanie destruktory szeregu obiektów utworzonychnew []
.Użycie
delete
na wskaźniku zwróconym przeznew []
lubdelete []
na wskaźniku zwróconym przeznew
powoduje niezdefiniowane zachowanie.źródło
delete[]
Operator służy do usuwania tablic.delete
Operator jest używany do usuwania przedmiotów nie tablicy. Wywołujeoperator delete[]
ioperator delete
działa odpowiednio w celu usunięcia pamięci, którą zajmowała tablica lub obiekt niebędący tablicą po (ostatecznie) wywołaniu destruktorów dla elementów tablicy lub obiektu niebędącego tablicą.Poniżej przedstawiono relacje:
typedef int array_type[1]; // create and destroy a int[1] array_type *a = new array_type; delete [] a; // create and destroy an int int *b = new int; delete b; // create and destroy an int[1] int *c = new int[1]; delete[] c; // create and destroy an int[1][2] int (*d)[2] = new int[1][2]; delete [] d;
Dla
new
który tworzy tablicę (tak, albonew type[]
czynew
stosowany do konstrukcji typu macierz), wygląd standard w odniesieniu dooperator new[]
klasy typu elementu tablicy lub w zasięgu globalnym i przekazuje żądaną ilość pamięci. Może zażądać więcej niżN * sizeof(ElementType)
gdyby chciał (na przykład zapisać liczbę elementów, aby później podczas usuwania wiedział, ile wywołań destruktora ma wykonać). Jeśli klasa zadeklaruje,operator new[]
że dodatkowy do ilości pamięci akceptuje innysize_t
, ten drugi parametr otrzyma liczbę przydzielonych elementów - może go użyć w dowolnym celu (debugowanie itp.).W przypadku tego,
new
który tworzy obiekt niebędący tablicą, będzie szukałoperator new
w klasie elementu lub w zasięgu globalnym. Przekazuje żądaną ilość pamięci (dokładniesizeof(T)
zawsze).W przypadku
delete[]
, sprawdza typ klasy elementów tablic i wywołuje ich destruktory.operator delete[]
Funkcja używana jest jeden w klasie typu elementu, albo jeśli nie ma nikogo wtedy w zasięgu globalnym.W przypadku
delete
, jeśli przekazany wskaźnik jest klasą bazową rzeczywistego typu obiektu, klasa bazowa musi mieć wirtualny destruktor (w przeciwnym razie zachowanie jest niezdefiniowane). Jeśli nie jest to klasa bazowa, wywoływany jest destruktor tej klasy i używany jestoperator delete
w tej klasie lub globalnejoperator delete
. Jeśli przekazano klasę bazową, wywoływany jest destruktor rzeczywistego typu obiektu ioperator delete
używany jest element znaleziony w tej klasie, a jeśli nie ma,operator delete
wywoływany jest element globalny . Jeślioperator delete
klasa ma drugi parametr typusize_t
, otrzyma liczbę elementów do zwolnienia.źródło
Jest to podstawowe użycie wzorca alokacji / alokacji DE w języku c ++
malloc
/free
,new
/delete
,new[]
/delete[]
Musimy odpowiednio z nich korzystać. Ale chciałbym dodać to szczególne zrozumienie różnicy między
delete
idelete[]
1)
delete
służy do usuwania alokacji pamięci przydzielonej dla pojedynczego obiektu2)
delete[]
służy do usuwania alokacji pamięci przydzielonej dla tablicy obiektówclass ABC{} ABC *ptr = new ABC[100]
kiedy mówimy
new ABC[100]
, kompilator może uzyskać informacje o tym, ile obiektów należy zaalokować (tutaj jest to 100) i wywoła konstruktor dla każdego z utworzonych obiektówale odpowiednio, jeśli po prostu użyjemy
delete ptr
w tym przypadku, kompilator nie będzie wiedział, ile obiektówptr
wskazuje i zakończy wywołanie destruktora i usunięcie pamięci tylko dla 1 obiektu (pozostawiając wywołanie destruktorów i cofnięcie alokacji pozostałych 99 obiektów). W związku z tym nastąpi wyciek pamięci.więc musimy użyć
delete [] ptr
w tym przypadku.źródło
free()
to i to. Jeśli używasz wzorca pseudo-destruktora, musisz wywołać go raz dla każdego obiektu za pomocąfor
pętli.Operatory
delete
idelete []
są używane odpowiednio do niszczenia obiektów utworzonych za pomocąnew
inew[]
, powracając do przydzielonej pamięci pozostałej dostępnej dla menedżera pamięci kompilatora.Obiekty utworzone za pomocą
new
muszą koniecznie zostać zniszczone za pomocądelete
, a tablice utworzone za pomocąnew[]
należy usunąć za pomocądelete[]
.źródło
Kiedy zadałem to pytanie, moje prawdziwe pytanie brzmiało: „czy jest między nimi różnica? Czy środowisko wykonawcze nie musi przechowywać informacji o rozmiarze tablicy, a więc czy nie będzie w stanie stwierdzić, którą z nich mamy na myśli?” To pytanie nie pojawia się w „pytaniach pokrewnych”, więc aby pomóc takim jak ja, oto odpowiedź na to pytanie: „dlaczego w ogóle potrzebujemy operatora delete []?”
źródło
delete
jest używany dla pojedynczego wskaźnika idelete[]
służy do usuwania tablicy za pomocą wskaźnika. To może pomóc ci lepiej zrozumieć.źródło
Cóż… może myślę, że to jest tylko wyraźne. Rozróżnia się operator
delete
i operator,delete[]
aledelete
operator może również zwolnić tablicę.test* a = new test[100]; delete a;
I już sprawdziłem ten kod, czy nie ma wycieku pamięci.
źródło