Zeichenketten/zeiger aus Funktionen zurückgeben



  • 1. Kann man sowas realisieren?

    wchar* function getstring()
    {
      wchar_t w1[10];
      w1 = "hallo"
    
      // kann man w1 auf diese Weise zurückgeben oder wird der Inhalt der Funktion 
      // mit seinen lokale Variablen vorher freigegeben?
    
      return w1;
    }
    
    // wenn das Bsp. ok ist, muss die zurückgebene Zeichenkette dann gleich 
    // in einen anderen string kopiert werden?
    

    2. Ist sowas legitim?:

    wchar* function getstring()
    {
      CString s1;
    
      s1 = "hallo";
    
      return s1.GetBuffer(s1.GetLength());
    }
    

    // und ab welcher Stelle wird der Buffer nach Aufruf der Funktion freigegeben?

    3. Speicher allozieren

    wchar* function getstring()
    {
      wchar_t* w1;
      w1 = new wchar_t[10];
    
      w1 = "hallo"
    
      // wann soll das delete gesetzt werden? 
      // vor dem return kann ich w1 nicht zurückgeben
      // und alles nach dem return wird nie ausgeführt
    
      return w1;
    }
    


  • Das erste geht sicher nicht - am Funktionsende wird das Array wieder freigegeben und ist weg.

    Beim zweiten bin ich mir nicht so sicher, aber womöglich räumt der CString-Dtor ebenfalls den verwendeten Speicher frei.

    Die dritte Lösung geht auf jeden Fall (abgesehen davon, daß du ein Speicherleck erzeugst - du solltest aus dem w1="Hallo" lieber ein strcpy(w1,"Hallo") machen).

    Aber besser ist es, gar keine blanken Zeiger zu verwenden:

    CString getstring()
    {
      CString s1;
      s1="Hallo";
      return s1;
    }
    

    PS: was hat eigentlich das 'function' in deinen Beispielen zu suchen?



  • Das erste geht sicher nicht - am Funktionsende wird das Array wieder freigegeben und ist weg.

    das schlimme ist, es ist ja meistens noch nicht mal weg.

    PS: was hat eigentlich das 'function' in deinen Beispielen zu suchen?

    weiss ich auch nicht.. gehört natürlich nicht da rein..

    Die dritte Lösung geht auf jeden Fall (abgesehen davon, daß du ein Speicherleck erzeugst - du solltest aus dem w1="Hallo" lieber ein strcpy(w1,"Hallo") machen).

    warum ist das besser? und was meinst du mit Speicherleck? Weil w1 nicht wieder freigegeben wird? kann man das freigeben dann auch ausserhalb der funktion machen?

    CString getstring()
    {
      CString s1;
      s1="Hallo";
      return s1;
    }
    

    was passiert genau in der letzten zeile (wird s1 kopiert?)

    Irgendwer meinte mal zu mir, dass es nicht so günstig ist CStrings (oder zeiger auf CStrings) zwischen DLLs auszutauschen. Man sollte dann besser mit reinen zeichenketten arbeiten, auf grund des unterschiedlichen Speicherbereiche beider. Oder kann man das getrost ignorieren.



  • Rio1 schrieb:

    Die dritte Lösung geht auf jeden Fall (abgesehen davon, daß du ein Speicherleck erzeugst - du solltest aus dem w1="Hallo" lieber ein strcpy(w1,"Hallo") machen).

    warum ist das besser? und was meinst du mit Speicherleck? Weil w1 nicht wieder freigegeben wird? kann man das freigeben dann auch ausserhalb der funktion machen?

    Das Speicherleck entsteht vor allem deshalb, weil du bei der Zuweisung w1="Hallo"; die Adresse des per new angeforderten Speicherbereiches vergisst und deinen Zeiger auf den (konstanten) String "Hallo" umbiegst, der irgendwo im Programm hinterlegt ist.
    (Merke: nackten Zeiger werden bei einer Zuweisung nur umgebogen, um den Inhalt zu kopieren, benötigst du strcpy(), memcpy() etc)

    Das Freigeben des Speichers kannst (und mußt - sonst stehst du vor dem selben Problem wie bei Variante 1) du außerhalb dieser Funktion erledigen.

    CString getstring()
    {
      CString s1;
      s1="Hallo";
      return s1;
    }
    

    was passiert genau in der letzten zeile (wird s1 kopiert?)
    und so wäre der code legitim

    Ja, beim return wird der Inhalt von s1 kopiert (evt ist CString referenzgezählt) und an den Aufrufer übergeben.



  • ...und CStrings kann ich getrost für Kommunikation zwischen DLL Funktionen nutzen?


Log in to reply