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.
Penghitungan referensi memerlukan kerja dari implementor kelas dan klien yang menggunakan objek dari kelas itu. 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 hitungan referensi internal objek, kemudian memeriksa apakah hitungan referensi telah turun menjadi nol. Jika sudah, itu berarti tidak ada yang menggunakan objek lagi, sehingga fungsi Release 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 adalah gagasan yang secara ketat dan jelas berbasis pada setiap penunjuk antarmuka. Oleh karena itu, objek yang memanfaatkan kemampuan ini dapat diimplementasikan dengan membangun, menghancurkan, memuat, atau membongkar sebagian fungsionalitas mereka secara dinamis, berdasarkan penunjuk antarmuka yang saat ini ada. Ini dalam istilah sehari-hari disebut antarmuka robekan .
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 pointer antarmuka, jumlah referensi menjadi dua. Klien harus memanggil Release dua kali pada penunjuk antarmuka untuk menghilangkan semua referensinya ke objek.
Contoh kasus di mana penghitungan referensi secara ketat dilakukan per penunjuk antarmuka terlihat ketika klien memanggil QueryInterface pada penunjuk pertama untuk antarmuka baru atau antarmuka yang sama. Dalam salah satu kasus ini, klien diharuskan untuk memanggil Release sekali untuk setiap pointer. 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.
Topik terkait