Avviso C6278
'variable' viene allocato con array new [], ma eliminato con l'eliminazione scalare. I distruttori non verranno chiamati.
Osservazioni:
Questo avviso viene visualizzato solo nel codice C++ e indica che la funzione chiamante ha allocato in modo incoerente la memoria con l'operatore array new []
, ma lo ha liberato con l'operatore scalare delete
. Questo utilizzo non è definito in base allo standard C++ e all'implementazione di Microsoft C++.
Esistono almeno tre motivi per cui è probabile che questa mancata corrispondenza causi problemi:
I costruttori per i singoli oggetti nella matrice vengono richiamati, ma i distruttori non vengono richiamati.
Se globale o specifico
operator new
della classe eoperator delete
non sono compatibili conoperator new[]
eoperator delete[]
, è probabile che si verifichino risultati imprevisti.È sempre rischioso basarsi sul comportamento non definito.
Le esatte ramificazioni di questo difetto sono difficili da prevedere. Potrebbero verificarsi perdite di classi con distruttori che eseguono la de-allocazione della memoria. Potrebbe causare un comportamento incoerente per le classi con distruttori che eseguono un'operazione semanticamente significativa o danneggiamenti della memoria e arresti anomali quando gli operatori sono stati sottoposti a override. In altri casi la mancata corrispondenza potrebbe non essere importante, a seconda dell'implementazione del compilatore e delle relative librerie. Gli strumenti di analisi non possono sempre distinguere tra queste situazioni.
Se la memoria viene allocata con la matrice new []
, deve essere liberata con la matrice delete[]
.
Nome dell'analisi del codice: ARRAY_NEW_DELETE_MISMATCH
Esempio
Il codice di esempio seguente genera l'avviso C6278:
class A
{
// members
};
void f( )
{
A *pA = new A[5];
// code ...
delete pA;
}
Per correggere questo avviso, usare il codice di esempio seguente:
void f( )
{
A *pA = new A[5];
// code ...
delete[] pA;
}
Se l'oggetto sottostante nella matrice è un tipo primitivo, ad int
esempio , float
, enum
o puntatore, non sono presenti distruttori da chiamare. In questi casi, viene invece segnalato l'avviso C6283 .
L'uso di new
e delete
presenta molte insidie in termini di perdite di memoria ed eccezioni. Per evitare completamente questi tipi di potenziali perdite, usare i meccanismi forniti dalla libreria standard C++ (STL). Sono inclusi shared_ptr
i contenitori , e , unique_ptr
ad esempio vector
. Per altre informazioni, vedere Puntatori intelligenti e libreria standard C++.
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per