new operator unterschied



  • Ich habe ein Buch vor mir und der Titel des Kapitels lautet nun

    Arrays im Heap (dynamisches Array)

    Hier schreibt man das man somit zur Laufzeit Speicher reservieren kann. Dieser soll dann vom Heap bezogen werden.

    int n;
    cin >> n;
    int *ptr = new int[n];
    

    was ist nun der Unterschied zu klassischen Variablen?

    int n;
    cin >> n;
    int array[n];
    
    1. Wird im zweiten Code der Speicher nicht im Heap reserviert?
    2. Die Programme werden doch in beiden fällen abgebrochen wenn die Reservierung fehlschlägt?
    3. wo ist der Unterschied des ersten codes zu "C" malloc außer das man exceptions nutzen "könnte"?

    Sorry aber ich bin c++ Anfänger 😕



    1. Wird im zweiten Code der Speicher nicht im Heap reserviert?

    Der zweite Code ist kein legales C++, da die Größe eines Arrays zur Compilezeit bekannt sein muss.
    Damit erledigt sich auch 2).

    1. wo ist der Unterschied des ersten codes zu "C" malloc außer das man exceptions nutzen "könnte"?

    Genaugenommen allokiert new Speicher aus dem Free Store und malloc aus dem Heap. Häufig gibt es keinen Unterschied zwischen den beiden, da new wohl häufig vom Compiler mit malloc implementiert wird (zumindest laut Sutter - Exceptional C++).
    Die beiden Varianten existieren meines Wissens nur aus Kompatibilitätsgründen zu C.



  • darkfate schrieb:

    1. Wird im zweiten Code der Speicher nicht im Heap reserviert?

    Nein, wenn n im zweiten Code eine Compilezeitkonstante wäre (damit daraus gültiges C++ wird), würde der Speicher nicht wie bei new auf dem free store reserviert sondern auf dem Stack.

    1. Die Programme werden doch in beiden fällen abgebrochen wenn die Reservierung fehlschlägt?

    Wenn für new kein freier Speicher zur Verfügung steht, fliegt eine Exception, die man fangen kann um darauf zu reagieren. Wenn der Stack überläuft ist Feierabend.

    1. wo ist der Unterschied des ersten codes zu "C" malloc außer das man exceptions nutzen "könnte"?

    malloc ruft keine Konstruktoren auf, außerdem kann man den operator new überladen.



  • Man kann sich überlegen, aus Performancegründen malloc und new unterschiedlich zu implementieren, weil die Hauptlast bei new auf sehr vielen sehr kleinen Speicheranorderungen liegt und bei malloc auf recht wenigen großen. Ein Nebeneffekt des Polymorphie-Tricks.


Log in to reply