Funkcja operatora new
Po napotkaniu w programie instrukcji, takich jak następujące, program przekłada je na wywołanie funkcji operator new:
Uwagi
char *pch = new char[BUFFER_SIZE];
Jeśli żądanie wymaga zero bajtów magazynu, operator new zwraca wskaźnik do różnych obiektów (czyli wielokrotne wywołania return new zwraca różne wskaźniki).Jeśli jest za mało pamięci dla żądania alokacji operator new zwraca wartość NULL lub wyrzuca wyjątek (zobacz Operatory new i delete aby uzyskać więcej informacji).
Można napisać procedurę, która próbuje zwolnić pamięć i ponowić próbę alokacji; zobacz _set_new_handler aby uzyskać więcej informacji.Aby więcej szczegółów na temat schematu odzyskiwania pamięci, zobacz następujący temat Warunki obsługi braku pamięci.
Dwa zakresy dla funkcji operator new opisano w poniższej tabeli.
Zakres dla funkcji operator new
Operator |
Zakres |
---|---|
::operator new |
Globalny |
class-name::operator new |
Klasa |
Pierwszy argument operator new musi być typu size_t (typ zdefiniowany w STDDEF.H) a typ zwracany to zawsze void *.
Globalna funkcja operator new jest wywoływana, gdy operator new jest używany do alokowania obiektów wbudowanych typów, obiektów o typie klasy, które nie zawierają zdefiniowanych przez użytkownika funkcji operator new i tablic dowolnego typu.Gdy operator new jest używany do alokowania obiektów typu klasy gdzie operator new jest zdefiniowany, wywoływany jest operator new tej klasy.
Funkcja operator new zdefiniowana dla klasy jest statyczną funkcją członkowską (która w związku z tym, nie może być wirtualna), która ukrywa globalną funkcję operator new dla obiektów tej klasy.Należy rozważyć przypadek gdzie new służy do przydzielania i ustawienia pamięci dla danej wartości:
// spec1_the_operator_new_function1.cpp
#include <malloc.h>
#include <memory.h>
class Blanks
{
public:
Blanks(){}
void *operator new( size_t stAllocateBlock, char chInit );
};
void *Blanks::operator new( size_t stAllocateBlock, char chInit )
{
void *pvTemp = malloc( stAllocateBlock );
if( pvTemp != 0 )
memset( pvTemp, chInit, stAllocateBlock );
return pvTemp;
}
// For discrete objects of type Blanks, the global operator new function
// is hidden. Therefore, the following code allocates an object of type
// Blanks and initializes it to 0xa5
int main()
{
Blanks *a5 = new(0xa5) Blanks;
return a5 != 0;
}
Argument podany w nawiasach do new jest przekazywany do Blanks::operator new jako argument chInit.Jednakże globalna funkcja operator new jest ukryta, powodując że kod taki jak ten poniżej wygeneruje błąd:
Blanks *SomeBlanks = new Blanks;
W Visual C++ 5.0 lub wcześniejszym, typów, które nie były klasami i wszystkie tablice (niezależnie od tego, czy były one typu klasy) przydzielone za pomocą operatora new zawsze używały globalnej funkcji operator new .
Począwszy od Visual C++ 5.0, kompilator obsługuje Członkowskie operatory new i delete tablicy w deklaracji klasy.Na przykład:
// spec1_the_operator_new_function2.cpp
class MyClass
{
public:
void * operator new[] (size_t)
{
return 0;
}
void operator delete[] (void*)
{
}
};
int main()
{
MyClass *pMyClass = new MyClass[5];
delete [] pMyClass;
}