Freigeben über


operator new-Funktion

Wenn eine Anweisung ähnlich der folgenden in einem Programm gefunden wird, wird sie in einen Aufruf der Funktion operator new übersetzt:

Hinweise

char *pch = new char[BUFFER_SIZE];

Wenn keine Speicherbytes angefordert werden, gibt operator new einen Zeiger auf ein bestimmtes Objekt zurück (wiederholte Aufrufe von operator new liefern also unterschiedliche Zeiger). Wenn für die Belegungsanforderung kein ausreichender Arbeitsspeicher zur Verfügung steht, gibt operator new den Wert NULL zurück oder löst eine Ausnahme aus (Weitere Informationen finden Sie unter Die Operatoren new und delete).

Sie können eine Routine schreiben, die versucht, Speicherplatz freizugeben, und die Speicherbelegung wiederholen. Weitere Informationen finden Sie unter _set_new_handler. Weitere Informationen zum Wiederherstellungsschema finden Sie im folgenden Thema Unzureichende Arbeitsspeicher-Zustände behandeln.

Die beiden Bereiche für operator new-Funktionen werden in der folgenden Tabelle beschrieben.

Bereich für "operator new"-Funktionen

Operator

Umfang

::operator new

Global

class-name::operator new

Klasse

Das erste Argument für operator new muss vom Typ size_t sein (ein Typ, der in STDDEF.H definiert ist), und der Rückgabetyp ist immer void *.

Die globale Funktion operator new wird aufgerufen, wenn der Operator new verwendet wird, um Objekte des integrierten Typs, Objekte des Klassentyps, die keine benutzerdefinierten operator new -Funktionen enthalten, sowie Arrays jeglichen Typs zuzuordnen. Wenn der new-Operator verwendet wird, um Objekte eines Klassentyps zuzuweisen, in dem operator new definiert ist, wird operator new dieser Klasse aufgerufen.

Eine operator new-Funktion, die für eine Klasse definiert wird, ist eine statischen Memberfunktion (die daher nicht virtuell sein kann), die die globale operator new-Funktion für Objekte dieses Klassentyps ausblendet. Betrachten Sie den Fall, in dem new verwendet wird, um Arbeitsspeicher zuzuweisen und auf einen angegebenen Wert festzulegen:

// 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;
}

Das Argument, das in Klammern für new bereitgestellt wird, wird an Blanks::operator new als chInit-Argument übergeben. Allerdings wird die globale operator new -Funktion ausgeblendet und bewirkt, dass Code wie der Folgende einen Fehler generiert:

Blanks *SomeBlanks = new Blanks;

In Visual C++ 5.0 und früher verwendeten Nichtklassentypen und alle Arrays (unabhängig davon, ob sie vom class-Typ waren), die mithilfe des new-Operators zugewiesen wurden, immer die globale operator new-Funktion.

Ab Visual C++ 5.0, unterstützt der Compiler Memberarray-new- und delete-Operatoren in einer Klassendeklaration. Beispiel:

// 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;
}

Siehe auch

Referenz

operator delete-Funktion

new-Operator (C++)

delete-Operator (C++)