Bagikan melalui


C28644

peringatan C28644: Mengembalikan nilai dari DPA_InsertPtr tidak diperiksa

Peringatan ini menunjukkan bahwa memori mungkin bocor.

Sebagian besar panggilan ke fungsi DPA_InsertPtr menggunakan variabel yang dialokasikan pada tumpukan. Functions kemudian menggunakan DPA dan membebaskan semua objek yang disimpan di DPA. Ketika DPA_InsertPtr gagal, objek yang dialokasikan tidak dapat lagi dibebaskan oleh kode pembersihan DPA, sehingga pemanggil DPA_InsertPtr perlu membebaskan memori. Perhatikan panggilan ke CleanupDPA dalam contoh berikut. Jika kode Anda tidak membebaskan objek yang dialokasikan dengan cara yang mirip dengan CleanupDPA Anda mungkin tidak perlu memperbaiki apa pun. Cacat ini mengasumsikan kita mengandalkan DPA untuk melacak semua objek yang harus kita bebaskan nanti.

Contoh kode berikut menghasilkan peringatan ini:

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

Contoh kode berikut menghindari peringatan ini:

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