C28644

警告 C28644: DPA_InsertPtr からの戻り値がチェックされていません

この警告は、メモリ リークが発生する可能性があることを示します。

DPA_InsertPtr 関数のほとんどの呼び出しでは、ヒープに割り当てられた変数が使用されます。 その後、関数は DPA を使用し、DPA に格納されているすべてのオブジェクトを解放します。 DPA_InsertPtr が失敗すると、割り当てられたオブジェクトは DPA クリーンアップ コードによって解放できなくなるため、DPA_InsertPtr の呼び出し元がメモリを解放する必要があります。 次の例では、CleanupDPA の呼び出しに注目してください。 CleanupDPA と同様の方法で割り当てられたオブジェクトを解放しないコードでは、何も修正する必要がない可能性があります。 この問題は、後で解放する必要があるすべてのオブジェクトを追跡するために DPA に依存していることが前提となります。

次のコード例では、この警告が生成されます。

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);
}
}  

次のコード例では、この警告が回避されます。

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);
}
}