Freigeben über


operator new-Funktion

Wenn eine Anweisung folgendermaßen in einem Programm auftritt, übersetzt sie in einen Aufruf der Funktion operator new:

Hinweise

char *pch = new char[BUFFER_SIZE];

Wenn kein Speicher Bytes (null) ist, gibt Operator neu einen Zeiger auf einen anderen Objekt zurück (das heißt wiederholte Aufrufe von verschiedenen RückholZeigern Operator neu ).Wenn Zuordnungen unzureichender Arbeitsspeicher für die Anforderungen gibt, gibt Operator neu NULL zurück oder löst eine Ausnahme aus (weitere Informationen finden Sie unter Das neue und delet-Operatoren ).

Sie können eine Routine schreiben, die versucht, Speicherplatz freizugeben und die Zuordnung zu wiederholen. Weitere Informationen finden Sie unter _set_new_handler .Weitere Informationen über dem Schema Wiederherstellen 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 neuen Funktionen

Operator

Umfang

::Operator neu

Global

Klassenname::Operator neu

Klasse

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

Die globale Operator neu Funktion wird aufgerufen, wenn der neu-Operator verwendet wird, um Objekte aus integrierten Datentypen des Klassentyps Objekte, die keine benutzerdefinierte Funktionen enthalten Operator neu und Arrays von einem Typ zugeordnet werden soll.Wenn der neu-Operator verwendet wird, um Objekte eines Klassentyps zuzuweisen, in dem Operator neu definiert ist, wird Operator neu dieser Klasse aufgerufen.

Eine Operator neu Funktion, die für eine Klasse definiert wird, ist eine static-Memberfunktion (die nicht virtuell sein), daher kann diese Felle die globale Operator neu Funktion für Objekte des Klassentyps.Betrachten Sie den Fall, in dem neu verwendet wird, um Arbeitsspeicher zu reservieren und einem angegebenen Wert festgelegt:

// 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 an neu in Klammern angegeben wird, wird auf Blanks::operator newchInit das als Argument übergeben.Allerdings wird die globale Operator neu Funktion ausgeblendet und bewirkt, dass Code wie den folgenden, einen Fehler zu generieren:

Blanks *SomeBlanks = new Blanks;

In Visual C++ 5.0 und früher, die Nicht-Klassen-Typen und alle Arrays (unabhängig davon, ob sie von Klasse-Typ zugeordnet waren) mithilfe des Operators neu immer die globale Operator neu Funktion.

Ab Visual C++ 5.0, unterstützt der Compiler Member array neu und delet-Operatoren in einer Klassendeklaration.Beispiele:

// 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-Funktion

new-Operator (C++)

delete-Operator (C++)