Istnieje bardzo subtelna różnica w C++ między operator new
a operatorem new
. (Przeczytaj to od nowa ... kolejność jest ważna!)
Funkcja operator new
jest analogiem C++ funkcji C malloc
. Jest to alokator pamięci surowej, którego zadaniem jest wyłącznie wytwarzanie bloku pamięci, na którym będą konstruowane obiekty. Nie wywołuje żadnych konstruktorów, ponieważ to nie jest jego zadanie. Zazwyczaj nie widzisz operator new
używanego bezpośrednio w kodzie C++; wygląda trochę dziwnie. Np
void* memory = operator new(137); // Allocate at least 137 bytes
Operator new
to słowo kluczowe jest odpowiedzialna alokacji pamięci dla obiektu i wywołując jej konstruktora. To najczęściej spotykane w C++. Kiedy piszesz
int* myInt = new int;
Używasz operatora new do przydzielenia nowej liczby całkowitej. Wewnętrznie operator new
działa mniej więcej tak:
- przydzielić pamięci do przechowywania żądany obiekt za pomocą
operator new
.
- Wywołaj konstruktor obiektu, jeśli taki istnieje. Jeśli spowoduje to wyjątek, zwolnij powyższą pamięć za pomocą
operator delete
, a następnie propaguj wyjątek.
- Powoduje zwrócenie wskaźnika do nowo skonstruowanego obiektu.
Ponieważ operator new
i operator new
są oddzielne, to możliwe jest użycie słowa kluczowego new
do konstruowania obiektów bez żadnego właściwie alokacji pamięci. Na przykład słynny obiekt umieszczenie nowego umożliwia zbudowanie obiektu pod dowolnym adresem pamięci w pamięci dostarczanej przez użytkownika. Na przykład:
T* memory = (T*) malloc(sizeof(T)); // Allocate a raw buffer
new (memory) T(); // Construct a new T in the buffer pointed at by 'memory.'
Przeciążenie operatora new
poprzez zdefiniowanie niestandardowego operator new
funkcja pozwala używać new
w ten sposób; określasz sposób alokacji, a kompilator C++ podłącza go do operatora new
.
Jeśli jesteś ciekawy, słowo kluczowe delete
działa w taki sam sposób.Istnieje funkcja dealokacji o nazwie operator delete
odpowiedzialna za usuwanie pamięci, a także operator delete
odpowiedzialny za wywoływanie destruktorów obiektów i zwalnianie pamięci. Jednak, na przykład,i operator delete
można stosować poza tymi kontekstami zamiast C malloc
i free
.
Krok drugi powinien brzmieć "Wywołaj konstruktor obiektu, jeśli taki jest." Jeśli to spowoduje * wyjątek *, zwolnij powyższą pamięć i propaguj wyjątek. " – GManNickG
@ GMan- Dzięki za spostrzeżenie! Mój błąd. Naprawię to. – templatetypedef
Naprawdę wspaniałe wyjaśnienie. Wielkie dzięki !!! –