C++ prüft, ob die von new ausgegebene Anforderung erfüllt wird

In C++ kann new im Allgemeinen erfolgreich sein, es sei denn, die angeforderte Speicherzuweisung ist extrem groß oder das System befindet sich in einem kritischen Zustand und es ist nur sehr wenig Speicher verfügbar.
Einige Anwendungen müssen die Zuweisung großer Speicherblöcke anfordern (z. B. Datenbankanwendungen). Im Allgemeinen
ist es wichtig, nicht davon auszugehen, dass die Speicherzuweisung erfolgreich ist. C++ bietet zwei Möglichkeiten, um sicherzustellen, dass Zeiger gültig sind. Die Standardmethode ist die Verwendung von Ausnahmen . Das heißt, wenn die Speicherzuweisung fehlschlägt, wird eine std::bad alloc- Ausnahme ausgelöst. Dies führt dazu, dass die Anwendung die Ausführung unterbricht. Wenn Sie keinen Ausnahmehandler bereitstellen, stürzt die Anwendung mit einer Meldung wie „Ausnahme nicht behandelt“ ab. Eine andere Methode besteht darin, das von C++ bereitgestellte Schlüsselwort new (nothrow) für die Speicherzuweisung zu verwenden , aber new (nothrow) löst keine Ausnahme aus und gibt direkt NULL zurück, sodass Sie vor der Verwendung des Zeigers nur die Gültigkeit überprüfen müssen.

Codebeispiel:

#include <iostream>
using namespace std ;
int main()
{
    try
        // Request lots of memory space
        int* pAge = new int [ 536870911] ;
        // Use the allocated memory
        delete[] pAge;
    catch (bad_ alloc)
    {
        cout << "Memory allocation failed. Ending program" << endl;
    }
    return 0; 
}

Der obige Code führt die Ausgabe aus: Speicherzuweisung fehlgeschlagen. Das beendende Programm
verwendet das Schlüsselwort new (nothrow) für die Speicherzuweisung.

#include <iostream>
using namespace std;
int main()
{
    // Request lots of memory space, use nothrow version
    int* pAge = new(nothrow) int [0x1fffffff];
    if (pAge)   // check pAge != NULL
    {
        // Use the allocated memory
        delete[] pAge;
    }
    else
        cout << "Memory allocation failed. Ending program" << endl;

    return 0; 
}



 

Guess you like

Origin blog.csdn.net/m0_46259216/article/details/127169949