Teilen über


Compilerfehler C2956

Die übliche Funktion zur Belegungsfreigabe „function“ würde als Platzierungsfunktion zur Belegungsfreigabe ausgewählt werden.

Hinweise

Die für die Platzierung neuer Ausdrücke gefundene Deallocation-Funktion stimmt mit einer der üblichen Deallocation-Funktionen überein. Entweder eine implizite compilergenerierte Deallocation oder eine explizite delete (oder delete[]) würde die falsche Deallocation-Funktion verwenden.

Fehler C2956 gibt an, dass Sie einen neuen Platzierungsausdruck , der Parameter akzeptiert) auf eine Weise verwendet haben, die zu einem Speicherverlust oder Laufzeitabsturz führen kann. Dies bedeutet in der Regel, dass der resultierende Wert nicht in einer typischen Weise gelöscht werden kann. Das heißt, entweder ein expliziter delete (oder delete[]) Ausdruck in Ihrem Code oder die implizite Deallocation, wenn ein Konstruktor eine Ausnahme auslöst, kann das falsche Aufrufen oder Bereitstellen des Fehlers operator delete mit den falschen Parametern.

Der C++-Standard gibt die üblichen Deallocation-Funktionen als Überladungen an operator delete oder operator delete[] verwendet zusätzliche Parameter vom Typ std::size_t (C++14 oder höher), std::align_val_t (C++17 oder höher) und std::destroying_delete_t (C++20 oder höher). Wenn Sie einen neuen Platzierungsausdruck verwenden, sucht der Compiler nach einer übereinstimmenden operator delete Funktion, die dieselben Parameter verwendet (nach dem ersten). Wenn eine gefunden wird und die Signatur mit einer üblichen Deallocation-Funktion übereinstimmt, meldet der Compiler den Fehler C2956.

Die Möglichkeit, das Problem zu beheben, hängt teilweise von Ihrer Absicht ab. In C++11 können Sie beispielsweise eine operator new Überladung definieren, die einen zusätzlichen size_t Parameter in Ihrer Klasse verwendet, um einen Wert an den Allocator zu übergeben. In C++14 verursacht derselbe Code jetzt einen Fehler:

#include <new>
struct T {
    void* operator new(std::size_t, std::size_t); // Placement allocation function
    void operator delete(void*, std::size_t); // now considered a usual deallocation function
};

T* p = new (0) T;   // error: usual deallocation function would be chosen as placement deallocation function

Wenn Sie beabsichtigen, den überbündeten Speicher für ein Objekt anzugeben, können Sie stattdessen die Ausrichtung direkt auf den Typ festlegen.alignas Weitere Informationen finden alignasSie unter Ausrichtung.

Wenn Sie den überbündeten Speicher für einen vom Heap zugewiesenen systemeigenen Typ oder ein Array angeben möchten, umschließen Sie ihn in einen structclass oder über den alignas Bezeichner. Dann können Normale new und delete Ausdrücke Instanzen, die ihre beabsichtigte Ausrichtung aufweisen, zuordnen und verlagern.

Beispiel

In diesem Beispiel verwendet die new-expression Platzierungssyntax mit einem Argument vom Typ std::align_val_t. Da der Typ T jedoch keine Ausrichtungsanforderung angibt, ruft ein delete-expression On für eine T* nicht übereinstimmende überbündige Deallocation-Funktion keine übereinstimmende Überlastungsfunktion auf. Stattdessen würde der Compiler die übliche Deallocation-Funktion void operator delete(void* ptr) noexceptaufrufen, die keine überbündige Zuordnung behandelt. Anstatt einen Absturz oder einen Speicherverlust zu verursachen, meldet der Compiler einen Fehler für diese Verwendung der Platzierung new:

#include <new>
struct T {};

int main()
{
    T* p = new (std::align_val_t{64}) T; // C2956
    delete p; // ordinary, not over-aligned delete
}

Um dieses Problem zu beheben, wenden Sie einen alignas Bezeichner auf T:

#include <new>
struct alignas(64) T {};

int main()
{
    T* p = new T; // invokes ::operator new(std::size_t, std::align_val_t)
    delete p; // now invokes ::operator delete(void*, std::align_val_t)
}