RAII sebagian tentang memutuskan kapan suatu objek menjadi bertanggung jawab atas pembersihannya sendiri - aturannya adalah bahwa objek menjadi bertanggung jawab jika dan ketika inisialisasi konstruktornya selesai. Simetri inisialisasi dan pembersihan, konstruktor dan destruktor, berarti keduanya memiliki ikatan yang erat satu sama lain.
Satu poin dari RAII adalah untuk memastikan keamanan pengecualian - bahwa aplikasi tetap konsisten saat pengecualian dilemparkan. Pada pandangan pertama ini sepele - ketika pengecualian menyebabkan ruang lingkup untuk keluar, variabel lokal dalam ruang lingkup itu perlu dihancurkan.
Tetapi apa yang terjadi jika lemparan eksepsi terjadi di dalam konstruktor?
Nah, objek belum sepenuhnya dibangun, jadi tidak bisa dihancurkan dengan aman. Konstruktor harus memiliki blok percobaan yang diperlukan untuk memastikan bahwa pembersihan yang diperlukan dilakukan sebelum pengecualian dilakukan. Setelah pengecualian berpropagasi di luar ruang lingkup di mana objek dibangun, tidak akan ada panggilan destruktor, karena objek tidak dibangun di tempat pertama.
Pertimbangkan secara khusus konstruktor untuk data anggota di dalam objek yang dihancurkan. Jika salah satu dari itu melempar pengecualian, kode konstruktor utama Anda tidak akan berjalan sama sekali - tetapi beberapa kode yang membentuk bagian implisit dari konstruktor itu akan miliki. Setiap anggota yang telah berhasil dibangun akan secara otomatis dihancurkan. Setiap anggota yang tidak dibangun (termasuk yang melempar pengecualian) tidak.
Jadi pada dasarnya, RAII adalah kebijakan yang memastikan bahwa segala sesuatu yang dibangun sepenuhnya akan dihancurkan tepat waktu, terutama di hadapan lemparan pengecualian, dan bahwa objek apa pun dapat dibangun sepenuhnya atau tidak (tidak ada setengah membangun objek yang Anda tidak bisa tahu cara membersihkan dengan aman). Sumber daya yang dialokasikan juga dibebaskan. Dan banyak pekerjaan yang dilakukan secara otomatis, sehingga programmer tidak perlu terlalu khawatir tentang hal itu.