Pointer löschen



  • Hallo zusammen

    habe folgendes geschrieben:

    time_t currentTime;
        struct tm * timeinfo;
    
        currentTime = time(NULL);
        timeinfo    = localtime(&currentTime);
    
        o_currentTime.r_date.i_year         = timeinfo->tm_year + 1900;
        o_currentTime.r_date.i_month        = timeinfo->tm_mon  + 1;
        o_currentTime.r_date.i_day          = timeinfo->tm_mday;
    
        o_currentTime.r_time.i_hour         = timeinfo->tm_hour;
        o_currentTime.r_time.i_minute       = timeinfo->tm_min;
        o_currentTime.r_time.i_seconds      = timeinfo->tm_sec;
        o_currentTime.r_time.i_milliseconds = 0;
    
        delete timeinfo;
    

    Normaerweise muss man doch am ende einer Methode mit den überschüssigen Pointer aufräumen, glaube ich idenenfalls.

    Nun habe ich aber ein Problem mit dieser Methode, läuft sie das erste Mal durch hat das System kein Problem, sobald das delete aber zum zweiten mal aufgerufen wird bricht das Prog ab mit folgener Meldung:
    <<User breakpoint called from code at 0x77f75a58>>

    Kann mir jemand erklären wieso?

    Vielen Dank im voraus



  • umgeht das problem doch einfach indem du anstatt n pointer eine instantz verwendest - wenn es in eine funktion ausgelagert ist wird es danach eh immer wieder zerstoert

    ein performance gewinn des pointers kann ich mir auch nicht vorstellen



  • Hallo,
    localtime liefert einen Zeiger auf ein statisches tm-Objekt. Der delete-Aufruf ist schlicht falsch. Und zwar bereits der erste. Der Vorteil der Verwendung eines statischen Elements liegt u.A. darin, dass du eben kein Speichermanagement durchführen musst. Einer der Nachteile ist, dass nachfolgende Aufrufe die Ergebnisse vorheriger Aufrufe verändern.



  • flownfluid schrieb:

    ...Normaerweise muss man doch am ende einer Methode mit den überschüssigen Pointer aufräumen, glaube ich idenenfalls....

    Das stimmt halt so nicht (ganz).
    Du musst überschüssigen Speicher aufräumen.
    Eigentlich einfach zu merken: Wenn Du irgendwo "new" (oder "malloc") schreibst, musst Du auch "delete" (free) schreiben.

    Hier schreibst Du kein new/malloc ... wenn dann auch nicht die Dokumentation der genutzten Funktion ein delete/free fordert, brauchst Du's auch nicht zu tun (bzw. ist sogar falsch - wie hier). 😃

    Gruß,

    Simon2.



  • Mr Evil schrieb:

    umgeht das problem doch einfach indem du anstatt n pointer eine instantz verwendest...

    Das ist an und für sich ein guter Tipp ... geht in diesem konkreten Fall aber halt nicht. localtime() liefert einfach einen Zeiger (auf ein statisches Objekt) zurück ... da hat man keine Wahl. (Dass das kein gutes Design ist, habe alle schon längst festgestellt - ist aber nicht mehr zu ändern).

    Gruß,

    Simon2.


Anmelden zum Antworten