Korrekte Überprüfung angelegten Speichers?!?



  • Hallo,
    ich allokiere in einer Klasse dynamisch Speicher.

    usigned int *m_puiErrIDs;
    m_puiErrIDs = new unsigned int[VARIABLE_AMOUNT];
    

    In dem Destruktor frage ich so ab:

    if(m_puiErrIDs)
        delete[] m_puiErrIDs;
    

    Wenn ich mir die Variable selber anschaue, dann ist die ja zu Beginn gar nicht 0 sondern m_puiErrIDs = 0xcdcdcdcd.
    Gibt es dafür ein Makro?
    Denn, wenn ich die Überprüfung so hinschreibe:

    if(m_puiErrIDs == 0xcdcdcdcd)
    

    , dann erscheinen folgende Fehlermeldungen:

    error C2446: '!=' : no conversion from 'unsigned int' to 'unsigned int*'
    error C2040: '!=' : 'unsigned int *' differs in levels of indirection from 'unsigned int'

    😕

    MfG,
    Paul.



  • Paul_C. schrieb:

    Wenn ich mir die Variable selber anschaue, dann ist die ja zu Beginn gar nicht 0 sondern m_puiErrIDs = 0xcdcdcdcd.
    Gibt es dafür ein Makro?

    Jein, das macht VC für dich, weil du die nicht initialisiert hast.
    Zeiger muss man sofort initialisieren, also entweder:

    usigned int *m_puiErrIDs = new unsigned int[VARIABLE_AMOUNT];
    

    oder

    usigned int *m_puiErrIDs = NULL;
    m_puiErrIDs = new unsigned int[VARIABLE_AMOUNT];
    

    Dann gibts auch kein 0xcdcdcdcd mehr. 🙂



  • Ja, das mit der 0 habe ich auch schon herausgefunden. Dachte aber, dass wäre eher ein Workaround und könnte es mir ersparen. 😉
    Dann mache ich das also so.
    Danke für die Hilfe!

    MfG,
    Paul.

    😃



  • Paul_C. schrieb:

    In dem Destruktor frage ich so ab:

    if(m_puiErrIDs)
        delete[] m_puiErrIDs;
    

    Die Prüfung ist unnötig, delete([]) 0 tut nichts.



  • Hm, gut zu wissen. Habe es selber noch nie ausprobiert.
    Danke.

    😉



  • MFK schrieb:

    Paul_C. schrieb:

    In dem Destruktor frage ich so ab:

    if(m_puiErrIDs)
        delete[] m_puiErrIDs;
    

    Die Prüfung ist unnötig, delete([]) 0 tut nichts.

    Bzw. wenn du es schön prüfen willst, solltest du es nach delete auch auf NULL setzen, sonst klappt das nicht. 😉



  • Das leuchtet mir ein. 🤡



  • estartu schrieb:

    Paul_C. schrieb:

    Wenn ich mir die Variable selber anschaue, dann ist die ja zu Beginn gar nicht 0 sondern m_puiErrIDs = 0xcdcdcdcd.
    Gibt es dafür ein Makro?

    Jein, das macht VC für dich, weil du die nicht initialisiert hast.

    Hier muss zumindest noch erwähnt werden, dass dies nur in der Debug-Version passiert. In der Release-Version hat die Variable einen zufälligen Wert!!!

    estartu schrieb:

    Zeiger muss man sofort initialisieren

    Und zwar i.d.R. im Konstruktor.



  • estartu schrieb:

    Bzw. wenn du es schön prüfen willst, solltest du es nach delete auch auf NULL setzen, sonst klappt das nicht. 😉

    Das ist doch ein Member. Warum sollte man dem im Destruktor noch irgendwas zuweisen?



  • Im Destruktor ist das wohl nicht nötig. Ich muss es aber noch woanders in meiner Anwendung überprüfen und gegebenenfalls löschen. 🙂

    @Jochen: Danke für die Info. Ist vielleicht banal, aber mir war das nicht bewusst.

    MfG,
    Paul.


Anmelden zum Antworten