Namespaces
Variants

std::set_new_handler

Aus de.cppreference.net
 
 
Dienstprogrammbibliothek
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Koroutinen-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Allgemeine Dienstprogramme
Relationsoperatoren (veraltet in C++20)
Integer-Vergleichsfunktionen
(C++20)(C++20)(C++20)    
(C++20)
Swap und Typoperationen
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Allgemeine Vokabular-Typen
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
Speicherverwaltungsbibliothek
Allokatoren
Speicherressourcen
Nicht initialisierter Speicher (bis C++20*)
Garbage-Collector-Unterstützung (bis C++23)
 
 
Definiert in Header <new>
std::new_handler set_new_handler( std::new_handler new_p ) throw();
(bis C++11)
std::new_handler set_new_handler( std::new_handler new_p ) noexcept;
(seit C++11)

Setzt new_p die neue globale new-handler-Funktion und gibt den zuvor installierten new-handler zurück.

Die new-handler-Funktion ist die Funktion, die von Allokationsfunktionen aufgerufen wird, wenn ein Speicherallokationsversuch fehlschlägt. Ihr vorgesehener Zweck ist einer von drei Dingen:

1) mehr Speicher verfügbar machen,
2) das Programm beenden (z.B. durch Aufruf von std::terminate),
3) eine Ausnahme vom Typ std::bad_alloc oder eine von std::bad_alloc abgeleitete Ausnahme werfen.

Die Standardimplementierung wirft std::bad_alloc. Der Benutzer kann seinen eigenen new-handler installieren, der ein anderes Verhalten als das Standardverhalten bieten kann.

Wenn der new-handler zurückkehrt, wiederholt die Allokationsfunktion den zuvor fehlgeschlagenen Allokationsversuch und ruft den new-handler erneut auf, wenn die Allokation erneut fehlschlägt. Um die Schleife zu beenden, kann der new-handler std::set_new_handler(nullptr) aufrufen: Wenn nach einem fehlgeschlagenen Allokationsversuch die Allokationsfunktion feststellt, dass std::get_new_handler einen Nullzeigerwert zurückgibt, wirft sie std::bad_alloc.

Beim Programmstart ist der new-handler ein Nullzeiger.

Diese Funktion ist threadsicher. Jeder Aufruf von std::set_new_handler synchronisiert-mit (siehe std::memory_order) den nachfolgenden std::set_new_handler- und std::get_new_handler-Aufrufen.

(seit C++11)

Parameter

new_p - Zeiger auf eine Funktion vom Typ std::new_handler oder ein Nullzeiger

Rückgabewert

Der zuvor installierte new-Handler oder ein null-Zeigerwert, falls keiner installiert war.

Beispiel

#include <iostream>
#include <new>
void handler()
{
    std::cout << "Memory allocation failed, terminating\n";
    std::set_new_handler(nullptr);
}
int main()
{
    std::set_new_handler(handler);
    try
    {
        while (true)
        {
            new int[1000'000'000ul]();
        }
    }
    catch (const std::bad_alloc& e)
    {
        std::cout << e.what() << '\n';
    }
}

Mögliche Ausgabe:

Memory allocation failed, terminating
std::bad_alloc

Siehe auch

Allokierungsfunktionen
(Funktion)
ermittelt den aktuellen New-Handler
(Funktion)
Funktionszeigertyp des New-Handlers
(Typdefinition)
Exception bei fehlgeschlagener Speicherallokation
(Klasse)