new & delete



  • Das müsste doch theoretisch 10000 x 10 Byte, also 100 KB Arbeitsspeicher fressen:

    int *x = new int[10000];
        for(int i = 0; i < 10000; i++)
            x[i] = 123456;
    

    Tut es aber nicht, der Arbeitsspeicher wird nicht belastet.

    Und ein delete [] x; funktioniert auch nicht! Warum?

    Kommt nur ein schwerer Fehler irgendwas mit blabla.IsValidPointer(pUserData)..

    Der obere Code steht im Konstruktor einer Klasse und im Destruktor steht daweil nichts weil delete ja nicht funktioniert.
    Sonst nur eine private: int *x;

    In der main steht nur

    Test test;

    Halt eine Instanz erstellen, und dann hab ich cin >> blabla gemacht.



  • Tut es aber nicht, der Arbeitsspeicher wird nicht belastet.

    Woran erkennst du das?

    IsValidPointer überprüft ob das ein gültiger pointer ist den du da rein gibts, ist bei dir nicht der fall, also ist das nicht mehr das x was du von new bekommen hast, oder du hast den heap kaputt gemacht.



  • // *** INCLUDES *** //
    #include "main.h"
    
    // *** CLASSES *** //
    class Test
    {
        int *x;
    public:
        Test(short);
        ~Test();
    };
    
    Test::Test(short c)
    {
        int *x = new int[c];
        for(int i = 0; i < c; i++)
            x[i] = 14535344;
    }
    
    Test::~Test()
    {
        ;
    }
    
    // *** MAIN FUNCTION *** //
    int main()
    {
        Test::Test(c);
    
        cin >> c;
    
        return 0;
    }
    
    #ifndef MAIN_H
    #define MAIN_H
    
    // *** INCLUDES *** //
    #include <windows.h>
    #include <iostream>
    using namespace std;
    
    #endif // MAIN_H
    

    Erkennen kann man das am TaskManager oder mit dem Process Explorer.



  • Ich meinte natürlich:

    [cpp]
    // *** MAIN FUNCTION *** //
    int main()
    {
    Test test;

    int c;
    cin >> c;

    return 0;
    }



  • Ach scheisse ne natürlich so:

    [cpp]
    int main()
    {
    int c = 10000;
    Test::Test(c);

    cin >> c;

    return 0;
    }


  • Mod

    Blödl schrieb:

    int *x = new int[10000];
        for(int i = 0; i < 10000; i++)
            x[i] = 123456;
    

    das steht so im konstruktor? dann wird dort nur eine lokale variable x initilalisiert und nicht der member x. konsequenterweise ist dieses x dann im destruktor nicht initialisiert.



  • Richtig. Danke. Bin noch Anfänger.



  • Trotzdem bin ich der Meinung, es wird kein Speicher reserviert.

    Physikalischer Speicher verfügbar: 654260

    Die Zahl bleibt immer gleich. (Wird ständig aktualisiert)

    Auch wenn c = 1 000 000 ist also 10 Millionen Bytes reserviert werden ...



  • vielleicht optimiert dein compiler das raus... wär grob fahrlässig, aber durchaus möglich.

    und vertrau nich auf "freier speicher", guck lieber, wieviel dein programm reserviert.



  • Blödl schrieb:

    Trotzdem bin ich der Meinung, es wird kein Speicher reserviert.

    Physikalischer Speicher verfügbar: 654260

    Du solltest du dir eher die Working Set-Größe deines Prozesses ansehen, als den freien physischen Speicher.

    Auch wenn c = 1 000 000 ist also 10 Millionen Bytes reserviert werden ...

    Es würde mich sehr wundern, wenn ein int bei dir 10 Bytes groß wäre. Ich tippe eher auf 4.



  • Blödl schrieb:

    Trotzdem bin ich der Meinung, es wird kein Speicher reserviert.

    Physikalischer Speicher verfügbar: 654260

    Die Zahl bleibt immer gleich. (Wird ständig aktualisiert)

    Auch wenn c = 1 000 000 ist also 10 Millionen Bytes reserviert werden ...

    Also entweder kann ich nicht mehr rechnen, aber...

    c= 1 000 000 und ein int hat 4 bytes, dann sollte doch eher bei

    x = new int[c];
    

    der Speicher mit c mal sizeof(int), spricht 4 * 1000000 angelegt werden.
    Sind nach Adam Riese und Eva Zwerg doch 4 Mille und nicht 10?!


Log in to reply