26

Szukałem podpisu nowego operatora. Który jest:nowy operator przydzielania pamięci na stercie

void* operator new (std::size_t size) throw (std::bad_alloc); 

Ale kiedy używamy tego operatora, nigdy nie używamy obsady. tj

int *arr = new int; 

Tak, jak C++ wskaźnik konwersji typu void* do int* w tym przypadku. Ponieważ nawet malloc zwraca wartość void* i musimy wyraźnie użyć rzutowania.

Odpowiedz

39

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:

  1. przydzielić pamięci do przechowywania żądany obiekt za pomocą operator new.
  2. 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.
  3. 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.

+0

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

+0

@ GMan- Dzięki za spostrzeżenie! Mój błąd. Naprawię to. – templatetypedef

+0

Naprawdę wspaniałe wyjaśnienie. Wielkie dzięki !!! –

4

Pomylisz wyrażenie new z funkcją operator new(). Gdy pierwszy z nich jest kompilowany, kompilator pośród innych rzeczy generuje wywołanie funkcji operator new() i przekazuje rozmiar wystarczający do przechowywania typu wymienionego w wyrażeniu new, a następnie zwracany jest wskaźnik tego typu.

+0

Do tego, kto zaaprobował - co jest nie tak z tą odpowiedzią? Wydaje się to całkowicie poprawne. – templatetypedef