Anfängerfragen



  • drakon schrieb:

    1. Ja, aber das hättest du auch aus einem Anfängerbuch erfahren können..

    Ja, stimmt wohl. Hab auch eins 😉 Mich wunderte nur, dass man die 2. Stelle einfach leer lassen kann

    drakon schrieb:

    2. Ja, allerdings ist p eigentlich lediglich ein Zeiger auf ein char, aber da ein Array von char implizit in ein char Zeiger umgewandelt werden kann stimmt das so.
    Den zweiten Teil verstehe ich nicht so ganz.. Du allokierst da ja in jedem Schritt 10'000 Byte. Und das geht einfach so lange, bis new fehl schlägt, was nicht bereits sein muss, wenn dein RAM voll ist. Es könnte theoretisch auch was auf die HD ausgelagert werden o.ä. So kannst du also die Grösse des RAMs nicht ausmessen. 😉

    Und bitte gib den Speicher am Ende wieder frei. Auch wenn es wahrscheinlich dein OS für dich macht sollte ein Programm den Speicher, denn es allokiert wieder frei geben. (siehe delete)

    Aber was sagt denn dann die 10000 in

    p = new char[10000];
    

    aus?

    Und den delete Befehl... einfach

    delete p
    

    am Ende, oder?



  • Man kann alle Stellen leer lassen. 😉 (das gibt dann das pendant zu while(1))

    Die 10'000 sagen aus, dass du da ein Array mit 10'000 char's anforderst. Zurückgegeben wird ein Zeiger auf das erste Element.

    Nein. Das freigeben klappt in deinem Fall nicht so einfach.
    1. Wenn du new hast, dann gibst du mit delete frei und wenn du new [] hast, dann gibst du den Speicher auch wieder mit delete[] frei.

    In deinem Falle verlierst du die den Zeiger auf die Arrays, weil du sie jedes mal überschreibst. Du musst dir also die Zeiger merken und nicht jedes mal überschreiben. (z.B in einem Array, oder einem Container der Standardbibliothek, wie z.B std::vector, std::list o.ä). Dann kannst du am Ende deines Programmes den ganzen Container durchlaufen und jedes Element freigeben.

    Also ich würde dir dringend raten Speicherverwaltung in C++ nochmal genau anzuschauen. Das scheint dir noch nicht ganz soo klar zu sein. (ist aber recht wichtig).



  • Ach ja, man prüft den Erfolg von new nicht, indem man sich den zurückgegebenen Zeiger anschaut (es sei denn, man verwendet Placement New mit std::nothrow ). Besser mit try/catch auf std::bad_alloc -Exceptions abfragen.



  • Barcelona schrieb:

    Nochmal eine Anfängerfrage... zu einer anderen Sache.

    Neue Frage -> neuer Thread

    Barcelona schrieb:

    Hab' ein Programmbeispiel gesehen zur Speicherzuweisung, welches
    checkt wieviel Speicher zur Verfügung steht.

    Leider ist das dumm 😣

    #include <iostream>
    #include <new>
    
    int main()
    {
      char *p;
      for (int i=1; ; i++) 
      {
        p = new(std::nothrow) char[1024*10]; //10*1024Byte = 10*1kB = 10kB
        if (p == 0)
          break;
        cout << "RAM zugeteilt: " << 10*i << "kB" << std::endl;
      }
    
    //schließen der konsole evtl verhindern!?
    }
    

    Hab dazu ein paar Fragen:
    1. In der for-Schleife: Was genau kommt in so eine Schleife?
    Zuerst Deklaration von Variablen? Dann Endbedingung? Dann Schritt, wenn Schleife durchlaufen wurde???

    1. google bzw buch/tut deiner wahl!?
    2. endbedingung stimmt allerdings nicht ganz - eher eine so-lange bedingung

    2. Ist mein Kommentar zu "p" richtig?
    Wenn ja, wieso findet das Programm dann bei mir zB 2 GB Ram, bei 10.000 Stellen
    im Array je 10 kb, wär das nur 1 GB maximal? Oder wie ist das?

    jopp - der zu p stimmt ausnahmsweise mal^^

    kA - deine Werte haben eh alle nich gestimmt 😛

    Weiß da jemand weiter, danke schon einmal! 🙂

    Jopp - ich hab dir mal nen funktionierenden Quellcode gepostet...

    bb



  • Danke erstmal für alle Antworten...
    hab' mich heute das erste Mal mit dem Thema beschäftigt,...

    #include <iostream>
    #include <new>
    
    int main()
    {
      char *p;
      for (int i=1; ; i++)
      {
        p = new(std::nothrow) char[1024*10]; //10*1024Byte = 10*1kB = 10kB
        if (p == 0)
          break;
        cout << "RAM zugeteilt: " << 10*i << "kB" << std::endl;
      }
    
    //schließen der konsole evtl verhindern!?
    }
    

    Wofür brauche ich denn das

    #include <new>
    

    ? Ich dachte die "new" und
    "delete" Funktion für Speicherzuteilung brauchen keinen Extra-Header...

    Und was macht das

    new(std::nothrow)
    

    ? 😕



  • 1. nimm doch bitte die schaltfläche C/C++ anstatt die mit Code beschriftete - dann kann man so gar noch was lesen...

    Barcelona schrieb:

    Wofür brauche ich denn das #include <new> ?

    für das std::nothrow

    Barcelona schrieb:

    Und was macht das new(std::nothrow) ?

    new wirft normalerweise eine exception, wenn nicht mehr genug speicher vorhanden ist
    wenn man aber möchte, dass es 0 zurückgibt und keine exception wirft, kann man new(std::nothrow) schreiben und schon funktioniert es genau so, wie es in dem fall wohl sinn machen würde...

    bb

    PS: Das nächste mal lies doch bitte zu erst mal in deinem Buch/Tutorial ein paar Seiten dazu und wenn dort nix steht, google bzw http://www.cplusplus.com/reference/
    oben links eingeben, was du suchst:
    http://www.cplusplus.com/query/search.cgi?q=nothrow
    erstes ergebnis:
    http://www.cplusplus.com/reference/std/new/nothrow/


Anmelden zum Antworten