C28644

avviso C28644: valore restituito da DPA_InsertPtr non selezionato

Questo avviso indica che la memoria potrebbe essere persa.

La maggior parte delle chiamate alla funzione DPA_InsertPtr usa una variabile allocata nell'heap. Le funzioni usano quindi il DPA e liberano tutti gli oggetti archiviati nel DPA. Quando DPA_InsertPtr ha esito negativo, l'oggetto allocato non può più essere liberato dal codice di pulizia DPA, quindi il chiamante di DPA_InsertPtr deve liberare la memoria. Si noti la chiamata a CleanupDPA nell'esempio seguente. Se il codice non libera gli oggetti allocati in modo simile a CleanupDPA , potrebbe non essere necessario correggere alcun elemento. Questo difetto presuppone che ci si basi sul DPA per tenere traccia di tutti gli oggetti che è necessario liberare in un secondo momento.

Nell'esempio riportato di seguito il codice genera questo avviso:

void Func()
{
    WCHAR*pszBuf=newWCHAR[MAX_PATH];
    DPA_InsertPtr(_hdpa, DA_LAST, pszBuf);
}

void CleanupDPA()
{
    int count = DPA_GetCount(_hdpa);
    for (int i = 0; i < count; i++)
{
    delete [] (LPWSTR)DPA_GetPtr(_hdpa, i);
}
}  

Gli esempi di codice seguenti evitano questo avviso:

void Func()
{
    WCHAR*pszBuf=newWCHAR[MAX_PATH];
    if (DPA_ERR == DPA_InsertPtr(_hdpa, DA_LAST, pszBuf))
    {
        delete [] pszBuf;
    }

}

void CleanupDPA()
{
    int count = DPA_GetCount(_hdpa);
    for (int i = 0; i < count; i++)
{
    delete [] (LPWSTR)DPA_GetPtr(_hdpa, i);
}
}