Warnung C6014
Speicherverlust 'Zeigername'.
Diese Warnung gibt an, dass der angegebene Zeiger auf den zugeordneten Speicher oder eine andere zugeordnete Ressource verweist, die nicht freigegeben wurde.
Hinweise
Der Analyzer überprüft auf diese Bedingung, wenn die _Analysis_mode_(_Analysis_local_leak_checks_)
-SAL-Anmerkung angegeben wird. Standardmäßig ist diese Anmerkung für den Windows-Kernelmoduscode (Treiber) angegeben. Weitere Informationen zu SAL-Anmerkungen finden Sie unter Verwenden von SAL-Anmerkungen zur Reduzierung von C/C++-Codefehlern.
Diese Warnung wird für Speicher- und Ressourcenlecks gemeldet, wenn die Ressource häufig an einen anderen Speicherort aliast wird. Der Speicher wird als Alias verwendet, wenn ein Zeiger auf den Speicher die Funktion mithilfe einer _Out_
Parameteranmerkung, einer globalen Variablen oder eines Rückgabewerts escapet. Diese Warnung kann beim Beenden der Funktion gemeldet werden, wenn das Argument kommentiert wird, dass seine Freigabe erwartet wird.
Die Codeanalyse erkennt nicht die tatsächliche Implementierung eines Speicherverteilers (mit Adressarithmetik) und erkennt nicht, dass Speicher zugewiesen wird (obwohl viele Wrapper erkannt werden). In diesem Fall erkennt die Analyse nicht, dass der Speicher zugewiesen wurde und diese Warnung ausgibt. Um das falsch positive Ergebnis zu unterdrücken, verwenden Sie eine #pragma warning(disable: 6014)
Direktive in der Zeile, die der öffnenden Klammer {
des Funktionstexts vorausgeht.
Codeanalysename: MEMORY_LEAK
Beispiele
Der folgende Code generiert Warnung C6014:
// cl.exe /analyze /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>
#include <string.h>
_Analysis_mode_(_Analysis_local_leak_checks_)
#define ARRAYSIZE 10
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};
void f( )
{
int *p = (int *)malloc(sizeof(int)*ARRAYSIZE);
if (p) {
memcpy(p, TEST_DATA, sizeof(int)*ARRAYSIZE);
// code ...
}
}
int main( )
{
f();
}
Der folgende Code korrigiert die Warnung durch Freigeben des Arbeitsspeichers:
// cl.exe /analyze /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>
#include <string.h>
_Analysis_mode_(_Analysis_local_leak_checks_)
#define ARRAYSIZE 10
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};
void f( )
{
int *p = (int *)malloc(sizeof(int)*ARRAYSIZE);
if (p) {
memcpy(p, TEST_DATA, sizeof(int)*ARRAYSIZE);
// code ...
free(p);
}
}
int main( )
{
f();
}
Um diese Arten potenzieller Lecks 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.
// cl.exe /analyze /EHsc /nologo /W4
#include <sal.h>
#include <memory>
using namespace std;
_Analysis_mode_(_Analysis_local_leak_checks_)
const int ARRAYSIZE = 10;
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};
void f( )
{
unique_ptr<int[]> p(new int[ARRAYSIZE]);
std::copy(begin(TEST_DATA), end(TEST_DATA), p.get());
// code ...
// No need for free/delete; unique_ptr
// cleans up when out of scope.
}
int main( )
{
f();
}
Siehe auch
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für