Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
"Deklaration" : es wurden keine übereinstimmenden Operatoren gelöscht; Arbeitsspeicher wird nicht freigegeben, wenn die Initialisierung eine Ausnahme auslöst.
Bemerkungen
Eine neue Platzierung wird verwendet, für die keine Platzierung gelöscht wird.
Wenn der Speicher für ein Objekt mit Operator newzugewiesen wird, wird der Konstruktor des Objekts aufgerufen. Wenn der Konstruktor eine Ausnahme auslöst, sollte jeder Speicher, der für das Objekt zugewiesen wurde, zugeordnet werden, zugeordnet werden. Dies kann nur ausgeführt werden, wenn eine Operatorfunktion delete vorhanden ist, die dem Operator newentspricht.
Wenn Sie den Operator new ohne zusätzliche Argumente verwenden und mit /GX-, /EHs- oder /EHa-Optionen kompilieren, um die Ausnahmebehandlung zu aktivieren, generiert der Compiler Code zum Aufrufen des Operators delete , wenn der Konstruktor eine Ausnahme auslöst.
Wenn Sie die Platzierungsform des new Operators (das Formular mit Argumenten zusätzlich zur Größe der Zuordnung) verwenden und der Konstruktor des Objekts eine Ausnahme auslöst, generiert der Compiler weiterhin Code zum Aufrufen des Operators delete. Dies geschieht jedoch nur, wenn eine Platzierungsform des Operators delete vorhanden ist, die dem Platzierungsformular des Operators new entspricht, der den Speicher zugewiesen hat.
Example
Zum Beispiel:
// C4291.cpp
// compile with: /EHsc /W1
#include <malloc.h>
class CList
{
public:
CList(int)
{
throw "Fail!";
}
};
void* operator new(size_t size, char* pszFilename, int nLine)
{
return malloc(size);
}
int main(void)
{
try
{
// This will call ::operator new(unsigned int) to allocate heap
// memory. Heap memory pointed to by pList1 will automatically be
// deallocated by a call to ::operator delete(void*) when
// CList::CList(int) throws an exception.
CList* pList1 = new CList(10);
}
catch (...)
{
}
try
{
// This will call the overloaded ::operator new(size_t, char*, int)
// to allocate heap memory. When CList::CList(int) throws an
// exception, ::operator delete(void*, char*, int) should be called
// to deallocate the memory pointed to by pList2. Since
// ::operator delete(void*, char*, int) has not been implemented,
// memory will be leaked when the deallocation cannot occur.
CList* pList2 = new(__FILE__, __LINE__) CList(20); // C4291
}
catch (...)
{
}
}
Im obigen Beispiel wird die Warnung C4291 generiert, da keine Platzierungsform des Operators delete definiert wurde, die mit der Platzierungsform des Operators newübereinstimmt. Um das Problem zu lösen, fügen Sie den folgenden Code oberhalb des Hauptcodes ein. Beachten Sie, dass alle überladenen Operator-Funktionsparameter delete mit denen des überladenen Operators newübereinstimmen, mit Ausnahme des ersten Parameters.
void operator delete(void* pMem, char* pszFilename, int nLine)
{
free(pMem);
}