operator new – funkce
Je-li příkaz obdobný následujícímu příkazu nalezen v programu, je přeložen jako volání funkce operator new:
Poznámky
char *pch = new char[BUFFER_SIZE];
Je-li vznesen požadavek na nula bajtů úložiště, vrátí funkce operator new ukazatel na konkrétní objekt (opakovaná volání funkce operator new tedy vrátí různé ukazatele).Není-li pro požadavek přidělení paměti k dispozici dostatek paměti, vrátí funkce operator new hodnotu NULL nebo vyvolá výjimku (další informace naleznete v tématu Operátory new a delete).
Lze napsat rutinu, která se pokusí uvolnit paměť a opakovat přidělení. Další informace naleznete v tématu _set_new_handler.Další informace o schématu obnovení naleznete v tématu Zpracování podmínek nedostatku paměti.
Dva obory funkcí operator new jsou popsány v následující tabulce.
Obor pro funkce operator new
Operátor |
Rozsah |
---|---|
::operator new |
Globální |
název-třídy::operator new |
Třída |
První argument funkce operator new musí být typu size_t (typ definované v souboru STDDEF.H) a návratový typ je vždy void *.
Globální funkce operator new je volána, je-li operátor new použit k přidělení paměti pro objekty předdefinovaných typů, objekty typu třídy neobsahující uživatelem definované funkce operator new a pole libovolného typu.Je-li operátor new použit k přidělení paměti pro objekty typů třídy, kde je funkce operator new definována, je tato funkce operator new dané třídy zavolána.
Funkce operator new definovaná pro třídu je statickou členskou funkcí (nemůže tedy být virtuální), která skrývá globální funkci operator new před objekty daného typu třídy.Uvažte případ, kdy je operátor new použit k přiřazení paměti dané hodnotě:
// 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 zadaný operátoru new v závorkách je předán funkci Blanks::operator new jako argument chInit.Globální funkce operator new je však skryta, v důsledku čehož například následující kód vygeneruje chybu:
Blanks *SomeBlanks = new Blanks;
V jazycích Visual C++ 5.0 a starších používaly netřídní typy a všechna pole (bez ohledu na to, zda byly typem třídy) s pamětí přidělenou operátorem new globální funkci operator new .
Počínaje jazykem Visual C++ 5.0 kompilátor podporuje v deklaracích tříd operátory new a delete pro členská pole.Příklad:
// 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;
}