strdup: free vs. delete[]

  • hallo,

    ich hab einen character pointer-array dessen Speicher per new angelegt wurde.
    ich möchte nun im konstrukter einer klasse einen dieser character strings des arrays einer member zuweisen - das mache ich per
    memberVar = strdup(string).
    im hauptprogramm wird nach dem diese konstruktor aurgerufen wird, das character stings - array per delete wieder freigegeben.
    muss ich nun im destruktor der klasse
    free(memberVar)
    aufrufen um den speicher wieder freizugeben - oder geht das auch per
    delete [] memberVar

    delete erzeugt immer eine Speicherverletzung - strdup, hat per malloc den speicher angefordert, also muss ich auch free verwenden, oder?


    danke,
    andi

  • strdup, hat per malloc den speicher angefordert, also muss ich auch free verwenden, oder?


    die man-page sagt eigentlich alles...

    Zitat von man strdup
    Code
    The  strdup() function returns a pointer to a new string which is a dupli-
           cate of the string s.  Memory for the new string  is  obtained  with  mal-
           loc(3), and [B]can be freed with free[/B](3).

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

  • strdup ist ja ja eine C funktion, und delete ein C++ keyword, macht allein schon daher keinen sinn.


    Das ist eine etwas schwache Argumentation: C++ beinhaltet auch alle "C-Funktionen" aus dem C89-Standard. strdup ist zwar nicht darunter, könnte es aber problemlos sein, ohne daß die Welt untergeht.

    Die Kernfrage ist: Darf ein mit malloc allokierter Pointer mit delete[] (das ist was anderes als delete!) freigegeben werden? AFAIK nein. (D.h. man kanns probieren, es ist aber nicht garantiert, daß es hinhaut.)

    *plantsch*

  • Nein, darfst du nicht. Leider funktioniert es mit vielen Compilern oder besser gesagt mit den mitgelieferten Runtime Libraries und fällt daher nicht so bald auf, aber grundsätzlich ist es "undefined behaviour".

  • mich die google suche nach "free delete delete[] c++" auf diesen thread bringt, frag ich mal ganz blöd. was ist der unterschied? warum muss man "sachen" ovn malloc mit free freigeben, und net mit delete? kann mich ja net so aus...

  • Weil das halt komplett unterschiedliche Dinge sind.

    malloc/free sind Funktionen der C Runtime Library.
    new/delete/delete[] sind Keywords von C++ bzw. Funktionen der C++ Runtime Library.

    Die müssen miteinander überhaupt nichts zu tun haben. Außerdem kann man die operatoren new/delete sowohl global als auch pro Klasse durch eigene Funktionen ersetzen. Und Destruktoren sollen auch noch aufgerufen werden — auch das geht nur mit delete (bzw. meistens delete[]).

  • Und Destruktoren sollen auch noch aufgerufen werden — auch das geht nur mit delete (bzw. meistens delete[]).


    Dem "meistens" kann ich nicht zustimmen. In "richtigem" C++ verwendet man sehr selten primitive Arrays. Viel "natürlicher" sind z.b. std::vector<T> oder QList<T> o.ä.

    Fistregel: Alles was man mit new[] anlegt, muss auch mit delete[] gelöscht werden. Dasselbe für new und delete. Siehe "Effective C++", Lektion 5.

    Dipper dipper dii dipper dii dipper dii duuu

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!