Programmieren - alles kontrollieren 4.940 Themen, 20.676 Beiträge

Zeigerakrobatik: Warum stürzt das Programm ab?

Yves3 / 2 Antworten / Flachansicht Nickles

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);
}

bei Antwort benachrichtigen
Yves3 Borlander „ Das schaut für mich irgendwie nicht wie ein Zeiger auf einen leeren String...“
Optionen

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);

bei Antwort benachrichtigen