Awal hari ini saya menemukan blok fungsi try-catch (sebenarnya dari di sini) dan kemudian melanjutkan sedikit penelitian - rupanya kegunaan utamanya adalah menangkap pengecualian yang dimasukkan oleh daftar penginisialisasi konstruktor.
Bagaimanapun, ini membuat saya berpikir tentang konstruktor yang gagal dan saya telah sampai pada tahap di mana saya hanya memerlukan sedikit klarifikasi. Ini semua hanyalah upaya saya untuk mempelajari lebih lanjut tentang bahasa tersebut, jadi saya tidak memiliki contoh praktis, tapi begini...
Diberikan contoh kode ini:
class A
{
private:
B b
C *c; //classes B, C & D omitted for brevity as not really relevant
D d;
public
A(int x, int y, int z)
};
A::A(int x, int y, int z)
try
: b( x )
, c( new C(y) )
, d( z )
{
//omitted
}
catch(...)
{
//omitted
}
Apa yang terjadi dalam kasus ini:
- Inisialisasi
b
menimbulkan pengecualian. - Inisialisasi
c
memunculkan pengecualian. - Inisialisasi
d
memunculkan pengecualian.
Secara khusus, saya ingin tahu setidaknya:
- apa yang akan/mungkin menyebabkan kebocoran memori dari
new C(y)
. Aku hanya memikirkan 3? (lihat di sini) - bisakah kamu
delete b
saja yang menangkapnya? Apakah berbahaya pada kasus 1 dan 2?
Jelas, menurut saya hal paling aman untuk dilakukan adalah menjadikan c
sebagai penunjuk cerdas. Namun jika kita mengabaikan pilihan tersebut untuk saat ini, tindakan apa yang terbaik?
Apakah aman untuk menyetel c
ke NULL
di penginisialisasi, lalu melakukan panggilan ke new
di badan konstruktor?
Itu berarti delete c
harus ditempatkan di catch jika ada sesuatu yang lain yang muncul di badan konstruktor? Apakah ada masalah keamanan saat melakukan hal itu (yaitu, jika c = new C(y);
itu sendiri yang melempar)?