Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Kondisi AV multithreaded
Peringatan ini menunjukkan bahwa utas berpotensi mengakses objek yang dihapus jika didahului.
Keterangan
Seharusnya tidak ada akses ke objek yang dihitung referensi setelah jumlah referensi berada di nol.
Nama analisis kode: INTERLOCKEDDECREMENT_MISUSE1
Contoh
Kode berikut menghasilkan peringatan ini. Ini adalah contoh urutan waktu utas yang dapat mengekspos masalah ini. Dalam contoh ini, m_cRef adalah anggota dari this:
Utas if T1 menjalankan kondisi, penurunan m_cRef menjadi 1, dan kemudian didahulukan.
Utas if T2 lain menjalankan kondisi, penurunan m_cRef ke 0, menjalankan if isi (di mana this dihapus), dan mengembalikan NULL.
Ketika T1 dijadwalkan ulang, T1 akan mereferensikan m_cref pada baris 9. Dengan demikian akan mengakses variabel anggota setelah pointer terkait this dihapus—dan ketika tumpukan untuk objek berada dalam status tidak diketahui.
ULONG CObject::Release()
{
if (0 == InterlockedDecrement(&m_cRef))
{
delete this;
return NULL;
}
/* this.m_cRef isn't thread safe */
return m_cRef;
}
Kode berikut tidak mereferensikan memori tumpukan apa pun setelah objek dihapus.
ULONG CObject::Release()
{
ASSERT(0 != m_cRef);
ULONG cRef = InterlockedDecrement(&m_cRef);
if (0 == cRef)
{
delete this;
return NULL;
}
return cRef;
}