Warnung C6308
"realloc" gibt möglicherweise einen NULL-Zeiger zurück: Das Zuweisen eines Nullzeigers zu "Parametername", der als Argument an "realloc" übergeben wird, bewirkt, dass der ursprüngliche Speicherblock geleert wird.
Hinweise
Heap-Relocation-Funktionen geben den übergebenen Puffer nicht frei, wenn die Neuverteilung nicht erfolgreich ist, was möglicherweise zu einem Speicherverlust führt, wenn er nicht ordnungsgemäß verarbeitet wird. Um das Problem zu beheben, weisen Sie das Ergebnis der Relocation-Funktion einer temporären Variablen zu, und ersetzen Sie dann den ursprünglichen Zeiger nach erfolgreicher Neuzuweisung.
Codeanalysename: REALLOCLEAK
Beispiel
Im folgenden Beispielcode wird die Warnung C6308 generiert. Dieses Problem stammt aus der Zuordnung des Rückgabewerts von realloc
zu x
. Wenn realloc
ein Fehler auftritt und ein NULL-Zeiger zurückgegeben wird, wird der ursprüngliche Speicher, auf x
den verwiesen wird, nicht freigegeben:
#include <malloc.h>
#include <windows.h>
void f( )
{
char *x = (char *) malloc(10);
if (x != NULL)
{
x = (char *) realloc(x, 512);
// code...
free(x);
}
}
Um das Problem zu beheben, können Sie eine temporäre Variable erstellen, um den Rückgabewert von realloc
. Mit dieser Änderung können Sie den zuvor zugewiesenen Speicher sicher freigeben, wenn realloc
ein Fehler auftritt:
#include <malloc.h>
#include <windows.h>
void f()
{
char *x = (char *) malloc(10);
if (x != NULL)
{
char *tmp = (char *) realloc(x,512);
if (tmp != NULL)
{
x = tmp;
}
// code...
free(x);
}
}
Diese Warnung kann Rauschen erzeugen, wenn zum Zeitpunkt der Zuordnung des Ergebnisses der Relocation-Funktion ein Livealias für den Puffer zu neu zugeordnet ist.
Um diese Arten von Problemen vollständig zu vermeiden, verwenden Sie die Mechanismen, die von der C++-Standardbibliothek (STL) bereitgestellt werden. Dazu gehören shared_ptr
, , unique_ptr
und Container wie vector
. Weitere Informationen finden Sie unter Intelligente Zeiger und C++-Standardbibliothek.