Lokal Speicher reservieren



  • Wenn man für einen Zeigerparameter innerhalb einer Funktion mit new Speicher reserviert, ist der ja nach der Funktion ungütlig, d.h. Zugriffe auf den Parameter schlagen fehl.
    Wie kann man das umgehen, wenn man den Speicher unbedingt erst innerhalb der Funktion und für den Parameter reservieren kann?



  • Hallo, du kannst dafür einfach Doppelzeiger verwenden.

    void foo(int** a)
    {
    *a = new int[200];
    }
    
    int main()
    {
    int* a;
    foo(&a);
    a[50] = 0;
    return 0;
    }
    

    MfG MAV



  • Wenn ich dich richtig verstanden habe, suchst du Referenzen (auf Zeiger)

    //wir wollen mal schlampig sein und delete vergessen ...
    void foo (const char *&x) { //dafür etwas obfuscated mit const correctness?
       char *y = new char[12];
       strncpy(y,"Hello World",12);
       x = y;
    }
    
    int main () {
       const char *x = "test";
       cout << x << endl;
       foo(x);
       cout << x << endl;
    }
    

    so what? naja, so lieber nicht 😉

    ist der ja nach der Funktion ungütlig, d.h. Zugriffe auf den Parameter schlagen fehl.

    naja, der speicher an sich ist nicht ungültig, der bleibt nur für immer reserviert und du hast nie mehr die möglichkeit, in freizugeben
    IMHO solltest du nur ganz niedrige funktionen auf die art mit speicher umgehen lassen, wenn überhaupt. da vergisst man ganz leicht das freigeben und man hat den eiersalat.

    also, was ich bevorzugen würde:
    alternative: std::string (referenzen auf std::string) (imho am saubersten)
    anders: neuen speicher mit return zurückgeben (imho sauberer als ref auf ptr oder ptr auf ptr)
    oder eben mit referenzen auf zeiger. (funktioniert dafür)

    /edit: dass noch jemand so früh wach ist, hätt ich nicht gedacht. hab mir extra viel zeit beim schreiben genommen...

    /edit2: const



  • Ich finde deine Lösung aber auch schöner, Referenzen auf Zeiger, darauf wäre ich garnicht geommen. 🙂
    Ist aber doch schön, dass da jetzt beide Lösungen stehen. 🙂



  • Hi,

    Also, wenn ich das Beispiel, das du gebracht hast, verwende, und a[50] dann in einem Konsolenprog mit printf() ausgebe, seh ich nichts in der Konsole (auch keine Fehlermeldung). Ok, kann vielleicht an der Konsole liegen, hab ich nich so viele Erfahrung mit.

    Aber: Wenn ich das mit einem char* Parameter mach und dann in main() nach dem Funktionsaufruf über Indizes den String füllen will, kommte natürlich der Fehler, dass z.B. char[2] nich in char* konvertiert werden kann.
    Verwende ich stattdessen strcpy(), kopier eine Konstante wie "Hallo" rein und geb den String danach wieder mit printf() aus, kommt wieder keine Ausgabe und kein Fehler.

    Woran liegt das?



  • @davie: Also mein Gesamtproblem ist eigentlich folgendes: Ich habe eine Struktur, die in sich einen Zeiger auf eine Liste weiterer Strukturen (desselben Types) hat, diese dann natürlich wiederum eine Liste solcher Zeiger usw., sie ist also beliebig verschachtelt.
    Nun will ich eine solche Baumstruktur mit werten initialisieren und eine Funktion schreiben, die mir diese initialisierte Struktur komplett, mit sämtlichen eventuell vorhandenen Unterstrukturen in eine andere kopiert.

    Da dachte ich an eine rekursive Funktion, die sich also immer für die Unterstrukturen selber aufruft.
    Nun muss ich natürlich erstmal entsprechend Speicher für die Unterstrukturen reservieren, und das lokal. Wenn ich die Funktion danach selbst aufruf, ist der Speicher aber wieder "weg", d.h. ich darf Members der einen Unterstruktur (die ich ja genau wie die Quellstrukt als Param übergeb) nichts zuweisen, dann stürzt der Kram ab.

    Das ist also grob beschrieben mein Problem.... 👍



  • Den Fehler, der da ausgegeben wird bei dir, kann ich so nicht nachvollziehen, gib mal ein wenig mehr Code.



  • Der Fehler trat beim ersten Quellcode auf, den du oben gepostet hattest, ohne Doppelpointer, den hast du dann ja rauseditiert, dann war es wieder richtig.


Anmelden zum Antworten