วันนี้ฉันค้นพบฟังก์ชั่น try-catch บล็อก (จาก ที่นี่ อันที่จริง) และ จากนั้นก็สนุกสนานไปกับการวิจัยเล็กน้อย - เห็นได้ชัดว่าพวกเขากำลังใช้งานหลักคือมันจับข้อยกเว้นโดยรายการตัวสร้างเริ่มต้น
อย่างไรก็ตาม สิ่งนี้ทำให้ฉันคิดถึงเรื่อง Constructor ที่ล้มเหลว และฉันก็มาถึงจุดที่ฉันต้องการคำชี้แจงเพียงเล็กน้อย นี่เป็นเพียงฉันพยายามเรียนรู้เพิ่มเติมเกี่ยวกับภาษา ดังนั้นฉันจึงไม่มีตัวอย่างที่ใช้งานได้จริง แต่ต่อไปนี้...
รับโค้ดตัวอย่างนี้:
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
}
จะเกิดอะไรขึ้นในกรณีเหล่านี้:
- การเริ่มต้นของ
b
ทำให้เกิดข้อยกเว้น - การเริ่มต้นของ
c
ทำให้เกิดข้อยกเว้น - การเริ่มต้นของ
d
ทำให้เกิดข้อยกเว้น
โดยเฉพาะอย่างยิ่ง ฉันต้องการทราบอย่างน้อย:
- อะไรจะ/อาจทำให้หน่วยความจำรั่วจาก
new C(y)
ฉันกำลังคิดแค่ 3 เท่านั้นเหรอ? (ดูที่นี่) - คุณสามารถ
delete b
ในระยะจับได้ไหม? เป็นอันตรายในกรณีที่ 1 และ 2 หรือไม่
แน่นอน ฉันเดาว่าสิ่งที่ปลอดภัยที่สุดที่ต้องทำคือทำให้ c
เป็นตัวชี้อัจฉริยะ แต่การเพิกเฉยต่อตัวเลือกนั้นในขณะนี้ อะไรคือแนวทางปฏิบัติที่ดีที่สุด?
ปลอดภัยหรือไม่ที่จะตั้งค่า c
เป็น NULL
ในค่าเริ่มต้น จากนั้นจึงทำการเรียกไปที่ new
ในเนื้อหาของ Constructor
นั่นหมายความว่าจะต้องวาง delete c
ไว้ใน catch ในกรณีที่มีอย่างอื่นพุ่งเข้าไปในตัว Constructor มีปัญหาด้านความปลอดภัยในการทำเช่นนั้นหรือไม่ (เช่น ถ้าเป็น c = new C(y);
เองที่พ่น)