Probleme mit Array und Visual Studio



  • http://de.wikipedia.org/wiki/Dynamischer_Speicher

    Der dynamische Speicher, auch Heap (engl. für Halde, Haufen), Halden- oder Freispeicher ist ein Speicherbereich, aus dem zur Laufzeit eines Programms zusammenhängende Speicherabschnitte angefordert und in beliebiger Reihenfolge wieder freigegeben werden können.

    Der Unterschied zum Stack (Stapel- oder Kellerspeicher) besteht darin, dass beim Stack angeforderte Speicherabschnitte in der umgekehrten Reihenfolge wieder freigegeben werden müssen, in der sie angefordert wurden. Beim Stack spricht man auch von automatischer Speicheranforderung.

    Programmiersprachen unterstützen die dynamische Speicheranforderung auf unterschiedliche Weisen. In ISO-C gibt es dafür beispielsweise die Funktionen malloc() und realloc(). Mit der Funktion free() wird der Speicher dann wieder freigegeben.

    In ISO-C++ gibt es außer den bereits von C übernommenen Funktionen die Möglichkeit, Speicher dynamisch mit Hilfe von new anzufordern bzw. mit delete wieder freizugeben.



  • Tachyon schrieb:

    JustSomeCoder schrieb:

    Leg dein Array einfach auf den Heap, dann geht's.

    Es gibt keinen Heap.

    ohne heap wären wohl alle programme bei denen man noch nicht zur compile-zeit weiß wie viel speicher sie jemals eventuell zur laufzeit brauchen werden, einfach unmöglich 😃 rofl

    wie wir jedoch alle wissen ist das glücklicherweise nicht so!!1

    von daher ist aussage es gäbe keinen heap wohl absoluter mist um es mal noch halbwegs freundlich auszudrücken 🙄



  • Es gibt in C++ einen "free store" von dem man Spiecher mittels operator new holen kann. Dieser Speicher kann, muss aber nicht, wie ein Heap organisiert sein. (Was nichts an der Tatsache ändert, dass es meistens so ist)

    Gruß
    Don06



  • Don06 schrieb:

    Es gibt in C++ einen "free store" von dem man Spiecher mittels operator new holen kann. Dieser Speicher kann, muss aber nicht, wie ein Heap organisiert sein. (Was nichts an der Tatsache ändert, dass es meistens so ist)

    Gruß
    Don06

    Zitat aus "The C++ Programming Language - Third Edition" by Bjarne Stroustrup:

    6.2.6 Free Store [expr.free]
    A named object has its lifetime determined by its scope (§4.9.4). However, it is often useful to cre-
    ate an object that exists independently of the scope in which it was created. In particular, it is com-
    mon to create objects that can be used after returning from the function in which they were created.
    The operator new creates such objects, and the operator delete can be used to destroy them.
    Objects allocated by new are said to be ‘‘on the free store’’ (also, to be ‘‘heap objects,’’ or ‘‘allo-
    cated in dynamic memory’’).

    EDIT: Und übrigens...

    Dravere schrieb:

    Kannst gerne mal den Standard danach durchsuchen, aber du wirst Mühe haben, das Wort zu finden, bzw. wahrscheinlich erst unter "25.3.6 Heap operations" 🙂

    Das Wort "heap" wird in dem obig genannten Standardwerk zur Programmiersprache C++ insgesamt 34 mal erwähnt, das erste mal auf Seite 44 und das letzte mal auf Seite 917. 😉


  • Administrator

    @JustSomeCoder,
    "The C++ Programming Language" ist auch nicht der C++ Standard. Es gibt ein eigenes Dokument für den C++ Standard und dort wirst du Heap nicht finden, zumindest nicht in diesem Zusammenhang.

    Wie Don06 gesagt hat, ist der "Free Store" meistens als Heap organisiert. Es gibt allerdings vom C++ Standard keine Vorschrift, dass dem der Fall sein muss. Deshalb hatte ich geschrieben, dass streng genommen, es wirklich keinen Heap in C++ gibt.

    Da kannst du noch so oft Wikipedia oder Bjarn Stroustrup zitieren, es steht nun mal nicht im Standard drin. Tut mir Leid, es ist zwar eigentlich irgendwie sinnfrei, aber Tachyon hat recht.

    Grüssli



  • Dravere schrieb:

    Wie Don06 gesagt hat, ist der "Free Store" meistens als Heap organisiert.

    Es geht in keinster Weise darum ob und wie der "Free Store" als Heap organisiert ist, wie du das immer umschreibst.

    Tatsache ist, dass es prinzipiell zwei Arten von Speicher gibt;

    - Stapelspeicher, der zur Compilezeit bereits feststeht. Der STACK.
    - Dynamischer Speicher, der erst zur Laufzeit festgelegt wird. Der HEAP.

    Mit der Aussage es gäbe in C++ keinen Heap vertritts du gleichzeitig den Standpunkt, dass dynamische Speicherverwaltung in C++ unmöglich wäre, was selbstverständlich absoluter Schwachsinn ist.



  • JustSomeCoder schrieb:

    Mit der Aussage es gäbe in C++ keinen Heap vertritts du gleichzeitig den Standpunkt, dass dynamische Speicherverwaltung in C++ unmöglich wäre, was selbstverständlich absoluter Schwachsinn ist.

    Was führt dich zu diesem Fehlschluss? Es geht hier nur um die Begrifflichkeit, nicht um die Existenz eines dynamischen Speichers an sich...



  • JustSomeCoder schrieb:

    Mit der Aussage es gäbe in C++ keinen Heap vertritts du gleichzeitig den Standpunkt, dass dynamische Speicherverwaltung in C++ unmöglich wäre, was selbstverständlich absoluter Schwachsinn ist.

    Nein, du verwendest lediglich die falsche Terminologie.

    Was du unter Heap verstehst, heisst Free Store.



  • Don06 schrieb:

    Es gibt in C++ einen "free store" von dem man Spiecher mittels operator new holen kann. Dieser Speicher kann, muss aber nicht, wie ein Heap organisiert sein. (Was nichts an der Tatsache ändert, dass es meistens so ist)

    der heap ist nicht immer wie ein heap organisiert.



  • volkard schrieb:

    der heap ist nicht immer wie ein heap organisiert sein.

    Exakt! Dank sei Gott versteht endlich mal jemand worum's eigentlich geht.

    In der Programmierung spricht man immer von "Stack und Heap", als Synonym für Stapelspeicher und dynamischen Speicher.

    Ob der "Heap" letztendlich wie ein "echter Heap" organisiert ist, ist völlig irrelevant.



  • volkard schrieb:

    der heap ist nicht immer wie ein heap organisiert sein.

    ? Verwirr mich bitte nicht so. Was meinst du? Hab ich einen krassen Grammatikfehler drin, wie du? Oder ist das was ich geschrieben habe sinnfrei?



  • Don06 schrieb:

    volkard schrieb:

    der heap ist nicht immer wie ein heap organisiert sein.

    ? Verwirr mich bitte nicht so. Was meinst du? Hab ich einen krassen Grammatikfehler drin, wie du?

    nein, kein grammatikfehler.

    Don06 schrieb:

    Oder ist das was ich geschrieben habe sinnfrei?

    nein. kein sinnfehler.

    nur halte ich es für nutzlos pingelig das wort heap zu verbannen. heap hat für mich mehrere bedeutungen, vor allem
    - binärbaum mit integritätsbedingung, daß die kinder dicker sind als der papa.
    - der speicherbereich, da wo man mit malloc und free sachen holt und freigibt.


  • Administrator

    @JustSomeCoder,
    Ja, man verwendet zum Beispiel in C++ oft Heap und meint eigentlich den Free Store. Nichts desto trotz ist es eigentlich falsch. Deshalb sprach ich eben auch immer von streng genommen 🙂
    Ich habe diese Unterscheidung noch in keinem Lehrbuch gesehen, weil die Unterscheidung meistens irrelevant ist. Korrekt ist es allerdings trotzdem nicht, würde aber den Neuling nur unnötig verwirren.

    Edit: Wie es volkard eigentlich sagt. Die Unterscheidung ist völlig pingelig 😉

    Grüssli



  • manchmal unterscheide ich heap(malloc/free) und freispeicher(new/delete).
    dann muß der freispeicher nicht einmal dort sein, wo der heap ist. malloc/free sollten optimiert sein für größere speicherbrocken, so ab 1k, wie man sie sich in C gerne holt. new/delete dagegen sollten optimiert sein für winzige objekte, wie man sie sich in C++ dauernd holt für die polymorphie. da legt man ja oft viele winz-objekte mit new an, damit man deren zeiger in eine gemeinsame liste stopfen kann. drum kann auch

    int* p=new int; free(p);
    

    ganz hübsch ins auge gehen. new[]/delete[] wiederum dürfen für die typischen größen von malloc/free optimiert sein, aber zu den verwaltungsinformationen kommt normalerweise noch die anzahl der arrayelemente dazu.


Anmelden zum Antworten