Korrekter Cast gesucht



  • Will man in einer von CWinApp abgeleiteten Klasse den Namen der INI-Datei oder der Hilfedatei ändern, so wird das wie folgt empfohlen:

    free((void*) m_pszProfileName);
    m_pszProfileName = _tcsdup(_T("D:\\appname.ini"));
    

    Meine Frage an euch: Wie castet man in der free-Anweisung m_pszProfileName mit C++-Casts? m_pszProfileName ist ein LPCTSTR.


  • Mod

    Du musst nur das const wegcasten.

    free(const_cast<LPTSTR>(m_pszProfileName));
    


  • Danke Dir! 🙂



  • Nur eine Randbemerkung: Ich hoffe für dich, daß der übergebene Zeiger auch von malloc() erzeugt wurde - und niemand eine Kopie dieses Zeigers aufgehoben hat.


  • Mod

    sri hat _tcsdup verwendet, und damit trifft dies wohl zu!



  • m_pszProfileName wird in CWinApp::SetCurrentHandles() mit _tcsdup angelegt und in CWinApp::~CWinApp() mit free freigeben. Sollte also passen. 🙂



  • OK, in dem Fall sollte es passen - mir kam es nur verdächtig vor, auf einen unbekannten Zeiger einfach free() loszulassen. Aber wenn das in der MSDN so empfohlen wird, sollte das seine Richtigkeit haben.



  • _tcsdup gehört zur strdup Familie, und für strdup ist AFAIK im C-Standard definiert dass man free zu verwenden hat.



  • hustbaer schrieb:

    _tcsdup gehört zur strdup Familie, und für strdup ist AFAIK im C-Standard definiert dass man free zu verwenden hat.

    Auch wenn es fast jeder Compiler unterstützt, ist man: strdup() NICHT im Ansi-Standard definiert. Und aus dem oben gegebenen Code-Ausschnitt war nicht ersichtlich, woher der ursprüngliche Wert von m_pszProfileName stammte (free() ist nur definiert, wenn der übergebene Zeiger von der malloc Familie geliefert wurde).

    Aber wie gesagt, inzwischen habe ich die MSDN bemüht - und wenn die sagt, daß man diesen Zeiger mit free() freigeben darf/muß, wird das schon stimmen 😃


Log in to reply