Array über die Grenzen hinaus beschreibbar, warum?



  • Dravere schrieb:

    Gehen wir mal eines nach dem anderen durch:

    int* nodes = new int[1];
    

    nodes ist ein Zeiger auf den ersten Speicherplatz eines Arrays mit 2 Integern, nämlich nodes[0] und nodes[1].

    Ui ui ui ...

    Ein "new int[1]" (also 1=Eins) erzeugt nur *ein* Element, somit ist nur "nodes[0]" gültig!!!

    PS: Wenn Du ein Array mit 2 (Zwei) willst, dann musst Du auch 2 (Zwei) sagen und nicht 1 (Eins)!



  • Neron17 schrieb:

    Na mit der Anweisung

    int* nodes = new int[1];
    

    reserviere ich doch einen gewissen Speicherbereich für einen Integerwert oder?

    Richtig erkannt - aber diesen Speicher brauchst du eigentlich gar nicht.

    Nun, die Definition der Funktion dijkstra sieht so aus:

    int* dijkstra( int start, int dest, HObject3D* mesh, int *nodenumber )
    

    Das Ergebnis der Funktion ist ein int*, der so erstellt wird:

    int* result = new int[counter];
    

    Dabei ist counter größer als 1 und die Funktion gibt dann result zurück

    return result;
    

    Nun weise ich also meinem int* nodes den int* result aus dijkstra zu, der auf einen größeren Speicherbereich zeigt, richtig? Ich hab mich halt gewundert, dass es hier keinen Konflikt gibt...

    Ja, auch richtig - du biegst den Zeiger "nodes" um auf den Bereich, der von deiner Funktion reserviert wurde.

    (und nach der Zuweisung "nodes=dijkstra(...);" hast du keine Möglichkeit mehr, auf den am Anfang angelegten Speicher zuzugreifen -> Speicherleck)

    @Dravere: Fast richtig - aber der Aufruf reserviert nur Platz für EIN int. Das Feld "nodes[1]" liegt bereits außerhalb des reservierten Bereiches.



  • Oh, da war ja noch einer schneller

    Dravere schrieb:

    nodes ist ein Zeiger auf den ersten Speicherplatz eines Arrays mit 2 Integern, nämlich nodes[0] und nodes[1].

    Autsch, klares Eigentor, sollte nicht passieren. Bin eigentlich per du mit der 0, aber habs hier total vergessen 😉

    Dravere schrieb:

    nodes = dijkstra( start, dest, obj, &nodenumber );
    

    Hier entsteht schon mal ein Speicherleck der Länge von 8 Bytes. "nodes" ist schliesslich nur ein Zeiger und kein Array. Du übergibst dem Zeiger nun einen Zeiger auf ein neues Array. Der alte Zeiger auf das alte Array geht dabei hoffnungslos verloren.

    Das ist auch ok, ich war mir nur nicht sicher, ob ich den Zeiger nicht mit new initialisieren muss.

    Dravere schrieb:

    Da nodes nun auf das neue Array zeigt, bzw. auf den ersten Speicherplatz, ist es kein Problem bis zur grösse counter zu gehen 😉

    Das wollt ich wissen!

    Dravere schrieb:

    Also es wäre somit sinnvoller für dich wenn du folgendes schreiben würdest:

    int* nodes = dijkstra( start, dest, obj, &nodenumber );
    

    Vielen Dank, werd ich gleich mal ausprobieren.

    Dravere schrieb:

    Schau dir vielleicht nochmals ein Tutorial Kapitel zu dem Heap durch. Könnte nix schaden ^^

    Ja, ähm, no comment 😃

    Edit: @Dravere: Boah, wat ne linke Nummer ;), hatt ich doch recht mit dem einen Platz. Dat kost aber einen 😛

    Nochmal danke an alle für die Hilfe 👍


  • Administrator

    [gelöscht]



  • Wenn du 1 angibst warum sollte dann ein Feld für 2 Integer angelegt werden? Das wäre doch total unlogisch. Es funktioniert wahrscheinlich nur zufällig.



  • no comment... der ganze Thread ist nen bissel... "ulkig"


  • Administrator

    HUUUUPS

    @(D)Evil
    *zustimm*

    Ich habe mich total vertan ^^ ... Das ist nun peinlich. Am liebsten hätte ich nun nix mehr geschrieben, sondern hätte mich nur noch verkrochen 😉

    Mein Fehler, hab da was sehr durcheinander gebracht. Oh graus ... von dieser Schande werde ich mich nie wieder erholen XD

    Ihr habt natürlich recht ... alles i.o. und meine Programme funktionieren nicht ohne Grund richtig, da ich es dort richtig gemacht habe 😛

    Grüssli



  • Dravere schrieb:

    Bei mir wird bei

    int* p = new int[1];
    

    ein Array von 2 Integern erstellt, genau gleich wie wenn man es auf dem Stack macht:

    int a[1];
    

    Was für ein Blödsinn!
    Debug doch mal rein, dann siehst Du wie viel Speicher tatsächlich allokiert wird! Nach Deiner "Logik" müssten es ja 8 Bytes sein...

    Und ein new "int[0]" würde 4 bytes allokieren, was genau dem Satz

    When the value of the expression in a direct-new-declarator is zero, the allocation function is called to allocate an array
    with no elements.

    wiederspricht...

    Siehe C++-Standard: Kapitel 5.3.4
    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf


  • Administrator

    @Jochen Kalmbach,

    Ich hab ja geschrieben, dass es blödsinn war. Jetzt reite doch bitte nicht noch drauf rum ^^

    Grüssli



  • Dravere schrieb:

    Ich hab ja geschrieben, dass es blödsinn war. Jetzt reite doch bitte nicht noch drauf rum ^^

    Ich hab die Antwort erstellt, während dem Du geantwortet hast... deswegen der Zeitunterschied...


Anmelden zum Antworten