Namensräume
Varianten
Aktionen

std::set_new_handler

Von cppreference.com
< cpp‎ | memory‎ | new
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-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 Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
 
Speicherverwaltungsbibliothek
(nur Exposition*)
Algorithmen für uninitialisierten Speicher
(C++17)
(C++17)
(C++17)
Beschränkte uninitialisierte
Speicher-Algorithmen
C-Bibliothek

Allocatoren
Speicherressourcen
Unterstützung für Garbage Collection
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
Uninitialisierter Speicher
Explizites Lebenszeitmanagement
 
 
Definiert im 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)

Legt new_p als neuen globalen New-Handler fest und gibt den zuvor installierten New-Handler zurück.

Die Funktion new-handler wird von Allokationsfunktionen aufgerufen, wann immer ein Speicherallokationsversuch fehlschlägt. Ihr beabsichtigter Zweck ist einer von drei Punkten:

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 einer von std::bad_alloc abgeleiteten Klasse auslösen.

Die Standardimplementierung löst std::bad_alloc aus. Der Benutzer kann seinen eigenen new-handler installieren, der ein anderes Verhalten als die Standardimplementierung bieten kann.

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

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) nachfolgende Aufrufe von std::set_new_handler und std::get_new_handler.

(seit C++11)

Inhalt

[edit] Parameter

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

[edit] Rückgabewert

Der zuvor installierte New-Handler oder ein Nullzeigerwert, falls keiner installiert war.

[edit] 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

[edit] Siehe auch

Allokationsfunktionen
(Funktion) [bearbeiten]
holt den aktuellen new handler
(Funktion) [bearbeiten]
Funktionszeigertyp des new handlers
(Typedef) [bearbeiten]
Ausnahme, die ausgelöst wird, wenn die Speicherallokation fehlschlägt
(Klasse) [bearbeiten]