Absturz bei REALLOC ?

Hallo!

Meine Funktion bringt das Programm zum Absturz, genauer gesagt bei strcpy() stürzt es ab. Wenn ich anstatt realloc() malloc() benutze, dann läuft es gut.

void pascal GetMsg(char * pBuffer)
{
try
{
CString strMsg = „ANOTHER“;

int iLen = strMsg.GetLength() + 1;
pBuffer = (char*)realloc(pBuffer, iLen);

strcpy(pBuffer, strMsg);
}
catch(…)
{
AfxMessageBox(„ERROR IN DLL FUNCTION“);
}
}

Bin dankbar für jeden kleinen Hinweis!

Ciao
Catmad

Hi!

Eine Sache, die mir auffällt ist, daß der neue Wert des Zeigers nicht zurückkommt.

char \*pChr = malloc(4711);
GetMsg(pChr); 
// pChr zeigt noch an die gleiche Stelle, der Speicher ist 
// aber in der Funktion freigegeben worden, realloc()
// liefert möglicherweise einen ganz anderen Zeiger zurück
// Also ist pChr möglicherweise ungültig.
GetMsg(pChr); // Geht schief, aber eigentlich schon im realloc() ?!

Das realloc() in der Funktion gibt im ersten Aufruf den Speicher frei, auf den pChr zeigt. Der neue Zeiger kann ganz woanders hin zeigen, wird aber nur in der Funktion in der lokalen Variablen „pBuffer“ gespeichert. D.h. nach dem Ende der Funktion ist der Wert futsch und Du weißt nicht mehr, wo Dein Speicherbereich eigentlich steckt.

Was sonst noch?
Ach ja, Deine Fehlermeldung sagt „Error in DLL Function“. Die alloc()-Funktionen greifen auf den Heap zu, der von der C-Runtime-Library verwaltet wird. Ich bin mir nicht sicher, ob nicht EXEs und DLLs unterschiedliche Heaps verwenden. D.h. wenn Du ein malloc() in der EXE machst und ein realloc() in der DLL, könnte es auch *puff* machen.

Und schlußendlich berichtet Microsoft noch von einem Bug bei mehrfachen ReAllocs von kleinen Speicherbereichen in der C-RTL bei Visual C++ 6.0:

http://support.microsoft.com/support/kb/articles/Q22…

Gruß, Ralf

die frage die man stellen kann ist :
was ist der unterschied zwischen realloc und malloc?
die realloc reserviert einen speicher und initatialiesiet ihn gleichzeitig mit nullen .hat vielleicht das mit fehler zu tun?
wenn du die fehler findest sag bitte bescheid.

Hi,

die realloc reserviert einen speicher und initatialiesiet ihn
gleichzeitig mit nullen .

Nee, das ist calloc(). realloc() kriegt einen Zeiger auf einen Speicherblock übergeben, belegt einen neuen Speicherblock und kopiert den Inhalt des alten Speicherblocks dahin (jedenfalls soviel wie Platz ist).

Gruß, Ralf

Hi Catmad,

realloc steht für Re-alloc. Das bedeutet dass Du hier realloziierst (erneut speicher anfordern). Da Deine Variable ‚pBuffer‘ vermutlich nit mit malloc schon Speicher alloziiert hat versucht realloc diesen Speicher (dynamisch) zu erweitern… ja richtig erweitern (oder auch verkleinern). Wenn also pBuffer auf einen Speicherbereich zeigt, der nicht Dir gehört kann das nur in die ‚Hose‘ gehen.
Was ist zu tun? malloc(). Solltest Du zb. bei verketteten Listen mehr SPeicher benötigen dann verwendet realloc.

gruss, Watz.