Hallo,
Mein Programm stürzt beim Freigen der Resourcen ab.
Für mich sieht aber eigentlich alles OK aus und ich kann den Fehler einfach nicht finden.
Hat jemand eine Idee?
Der entscheidende Programmteil:
WCHAR **_sz;
// Wenn keine variablen Strings vorhanden sind, dann muss der Zeiger auf einen leeren String zeigen,
// andernfalls stürzt die Funktion FormatMessage unter bestimmten Umständen ab
if(m_pevlr->NumStrings != 0)
_sz = (WCHAR**)malloc((m_pevlr->NumStrings)* sizeof(WCHAR*)+ ADDITIONAL_POINTERS * sizeof(WCHAR*));
else
_sz = 0;
if(uSize > 0) // Nur ausführen, wenn es einen variablen Teil gibt
{
memcpy(pwcDescription, (WCHAR*)((LPBYTE)m_pevlr + m_pevlr->StringOffset), uSize);
// Die einzelnen Strings, die im Speicher gefunden werden, auf ein zweidimmensionales Array aufteilen...
UINT uStringOffset = 0;
UINT uCounter = 0;
while(uCounter NumStrings)
{
wcout wcout _sz[uCounter] = (WCHAR*) malloc((wcslen((WCHAR *)(pwcDescription + uStringOffset)) + 1) * sizeof(WCHAR));
wcscpy(_sz[uCounter], (WCHAR *)(pwcDescription + uStringOffset));
uStringOffset += wcslen((WCHAR *)(pwcDescription + uStringOffset)) + 1;
uCounter++;
}
for(UINT i=uCounter; i {
_sz[i] = (WCHAR*) malloc(2*sizeof(WCHAR));
_sz[i] = L"";
}
}
if(uSize > 0) // In dem Fall wurde der Speicher alloziert
{
for(UINT i=0; iNumStrings)+ADDITIONAL_POINTERS); i++)
free(_sz[i]); // Stürtz beim ersten leeren String ab
free(_sz);
}
Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge
Das schaut für mich irgendwie nicht wie ein Zeiger auf einen leeren String aus, sofern an dieser Speicheradresse nicht gerade zufällig einer liegt...
Danke für den Hinweis!
Das soll zwar nicht ein Zeiger auf einen leeren String sein... aber ein Fehler ist es trotzdem :)
Es gab aber noch einen zweiten Fehler:
_sz[i] = L"";
Der Zeiger zeigt auf den Speicherbereich des konstanten Strings "", anstatt auf den mit malloc allozierten Speicher.
Free() versucht dann mehrfach den Speicher der Konstanten freizugeben, was nicht geht.
Hier die funktionierende Version:
WCHAR **_sz;
// Wenn keine variablen Strings vorhanden sind, dann muss der Zeiger mit 0 initialisiert werden,
// andernfalls stürzt die Funktion FormatMessage unter bestimmten Umständen ab
_sz = (WCHAR**)malloc((m_pevlr->NumStrings)* sizeof(WCHAR*)+ ADDITIONAL_POINTERS * sizeof(WCHAR*));
if(uSize > 0) // Nur ausführen, wenn es einen variablen Teil gibt
memcpy(pwcDescription, (WCHAR*)((LPBYTE)m_pevlr + m_pevlr->StringOffset), uSize);
// Die einzelnen Strings, die im Speicher gefunden werden, auf ein zweidimmensionales Array aufteilen...
UINT uStringOffset = 0;
UINT uCounter = 0;
while(uCounter NumStrings)
{
_sz[uCounter] = (WCHAR*) malloc((wcslen((WCHAR *)(pwcDescription + uStringOffset)) + 1) * sizeof(WCHAR));
wcscpy(_sz[uCounter], (WCHAR *)(pwcDescription + uStringOffset));
uStringOffset += (wcslen((WCHAR *)(pwcDescription + uStringOffset)) + 1);
uCounter++;
}
for(UINT i=uCounter; i {
_sz[i] = (WCHAR*) malloc(2*sizeof(WCHAR));
wcscpy(_sz[i],L"x");
}
for(UINT i=0; iNumStrings)+ADDITIONAL_POINTERS); i++)
free(_sz[i]);
free(_sz);