1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

strdup: free vs. delete[]

    • Frage
  • Keyser_Sozo
  • 23. Januar 2008 um 11:40
  • Unerledigt
  • Keyser_Sozo
    11
    Keyser_Sozo
    Mitglied
    Punkte
    1.165
    Beiträge
    163
    • 23. Januar 2008 um 11:40
    • #1

    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


    check this:
    http://www.longplaypark.com/

  • Ringding
    11
    Ringding
    Mitglied
    Reaktionen
    12
    Punkte
    1.237
    Beiträge
    244
    • 23. Januar 2008 um 11:53
    • #2

    Ja, musst du.

  • Kampi
    27
    Kampi
    Mitglied
    Reaktionen
    193
    Punkte
    7.828
    Beiträge
    1.468
    • 23. Januar 2008 um 12:52
    • #3
    Zitat von Keyser_Sozo

    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.

  • Keyser_Sozo
    11
    Keyser_Sozo
    Mitglied
    Punkte
    1.165
    Beiträge
    163
    • 23. Januar 2008 um 13:01
    • #4

    ah danke!

    die borland builder hilfe zu den funktionen sagt nur dass per malloc was allokiert wird - wusste nicht ob ich da eben delete oder free verwenden soll.

    danke,
    andi


    check this:
    http://www.longplaypark.com/

  • MaxAuthority
    17
    MaxAuthority
    Gewinner des Desktop-Contest 2002
    Reaktionen
    5
    Punkte
    3.165
    Beiträge
    626
    • 23. Januar 2008 um 17:52
    • #5
    Zitat von Keyser_Sozo

    ah danke!

    die borland builder hilfe zu den funktionen sagt nur dass per malloc was allokiert wird - wusste nicht ob ich da eben delete oder free verwenden soll.

    danke,
    andi

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

    http://vimperator.org - Make Firefox behave like Vim

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 23. Januar 2008 um 21:03
    • #6
    Zitat von MaxAuthority

    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*

  • Ringding
    11
    Ringding
    Mitglied
    Reaktionen
    12
    Punkte
    1.237
    Beiträge
    244
    • 23. Januar 2008 um 22:46
    • #7

    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".

  • bimbo
    15
    bimbo
    Mitglied
    Reaktionen
    15
    Punkte
    2.320
    Beiträge
    390
    • 24. Januar 2008 um 17:01
    • #8

    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...

    LVA Erfahrungsberichte: http://vowi.fsinf.at/

  • Ringding
    11
    Ringding
    Mitglied
    Reaktionen
    12
    Punkte
    1.237
    Beiträge
    244
    • 24. Januar 2008 um 17:30
    • #9

    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[]).

  • sauzachn
    17
    sauzachn
    Mitglied
    Reaktionen
    51
    Punkte
    3.101
    Beiträge
    606
    • 24. Januar 2008 um 23:35
    • #10
    Zitat von Ringding

    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

  • Ringding
    11
    Ringding
    Mitglied
    Reaktionen
    12
    Punkte
    1.237
    Beiträge
    244
    • 25. Januar 2008 um 08:40
    • #11

    Ok ich hab mich wohl nicht klar ausgedrückt. delete statt delete[] zu verwenden hat "meistens" zur Folge, dass Destruktoren nicht aufgerufen werden. Jedenfalls hast du recht.

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung