Bagikan melalui


Menerapkan Penghitungan Referensi

Penghitungan referensi memerlukan pekerjaan pada bagian dari implementor kelas dan klien yang menggunakan objek kelas tersebut. Saat menerapkan kelas, Anda harus menerapkan metode AddRef dan Release sebagai bagian dari antarmuka IUnknown. Kedua metode ini memiliki implementasi sederhana berikut:

  • AddRef menambah jumlah referensi internal objek.
  • Rilis terlebih dahulu mengurangi jumlah referensi internal objek, lalu memeriksa apakah jumlah referensi telah jatuh ke nol. Jika memiliki, itu berarti tidak ada yang menggunakan objek lagi, sehingga fungsi Rilis membatalkan alokasi objek.

Pendekatan implementasi umum untuk sebagian besar objek adalah hanya memiliki satu implementasi metode ini (bersama dengan QueryInterface), yang dibagikan antara semua antarmuka, dan oleh karena itu jumlah referensi yang berlaku untuk seluruh objek. Namun, dari perspektif klien, penghitungan referensi secara ketat dan jelas merupakan gagasan per penunjuk antarmuka, dan oleh karena itu objek yang memanfaatkan kemampuan ini dengan membangun, menghancurkan, memuat, atau membongkar bagian fungsionalitas secara dinamis berdasarkan penunjuk antarmuka yang saat ini masih ada dapat diimplementasikan. Ini secara kolektif disebut antarmuka air mata.

Setiap kali klien memanggil metode (atau fungsi API), seperti QueryInterface, yang mengembalikan pointer antarmuka baru, metode yang dipanggil bertanggung jawab untuk meningkatkan jumlah referensi melalui penunjuk yang dikembalikan. Misalnya, ketika klien pertama kali membuat objek, klien menerima penunjuk antarmuka ke objek yang, dari sudut pandang klien, memiliki jumlah referensi satu. Jika klien kemudian memanggil AddRef pada penunjuk antarmuka, jumlah referensi menjadi dua. Klien harus memanggil Rilis dua kali pada penunjuk antarmuka untuk menghilangkan semua referensinya ke objek.

Contoh bagaimana jumlah referensi secara ketat per penunjuk antarmuka terjadi ketika klien memanggil QueryInterface pada pointer pertama untuk antarmuka baru atau antarmuka yang sama. Dalam salah satu kasus ini, klien diharuskan untuk memanggil Rilis sekali untuk setiap penunjuk. COM tidak mengharuskan objek mengembalikan penunjuk yang sama ketika dimintai antarmuka yang sama beberapa kali. (Satu-satunya pengecualian untuk ini adalah kueri untuk IUnknown, yang mengidentifikasi objek ke COM.) Ini memungkinkan implementasi objek untuk mengelola sumber daya secara efisien.

Thread-safety juga merupakan masalah penting dalam menerapkan AddRef dan Release. Untuk informasi selengkapnya, lihat Proses, Utas, dan Apartemen.

Mengelola Masa Pakai Objek Melalui Penghitungan Referensi