ฉันไม่อยากจะเชื่อเลยจริงๆ ว่าฉันไม่สามารถหาคำตอบที่ชัดเจนสำหรับเรื่องนี้ได้...
คุณจะเพิ่มหน่วยความจำที่จัดสรรได้อย่างไรหลังจากตัวสร้างคลาส C++ ส่งข้อยกเว้น ในกรณีที่เริ่มต้นโดยใช้ตัวดำเนินการ new
เช่น.:
class Blah
{
public:
Blah()
{
throw "oops";
}
};
void main()
{
Blah* b = NULL;
try
{
b = new Blah();
}
catch (...)
{
// What now?
}
}
เมื่อฉันลองสิ่งนี้ b
จะเป็น NULL ในบล็อก catch (ซึ่งสมเหตุสมผล)
เมื่อทำการดีบั๊ก ฉันสังเกตเห็นว่าคอนโรลเข้าสู่รูทีนการจัดสรรหน่วยความจำก่อนที่จะกระทบกับคอนสตรัคเตอร์
สิ่งนี้บนเว็บไซต์ MSDN ดูเหมือนว่าจะยืนยันสิ่งนี้:
เมื่อ new ถูกใช้เพื่อจัดสรรหน่วยความจำสำหรับอ็อบเจ็กต์คลาส C++ ตัวสร้างของอ็อบเจ็กต์จะถูกเรียกหลังจากจัดสรรหน่วยความจำแล้ว
ดังนั้น โปรดทราบว่าตัวแปรโลคัล b
ไม่เคยถูกกำหนดไว้ (เช่น เป็น NULL ใน catch block) คุณจะลบหน่วยความจำที่จัดสรรได้อย่างไร
คงจะดีถ้าได้รับคำตอบข้ามแพลตฟอร์มเกี่ยวกับเรื่องนี้ นั่นคือข้อมูลจำเพาะ C ++ พูดว่าอย่างไร
คำชี้แจง: ฉันไม่ได้พูดถึงกรณีที่คลาสจัดสรรหน่วยความจำใน c'tor แล้วจึงโยน ฉันซาบซึ้งที่ในกรณีเหล่านั้น d'tor จะไม่ถูกเรียก ฉันกำลังพูดถึงหน่วยความจำที่ใช้ในการจัดสรรวัตถุ THE (Blah
ในกรณีของฉัน)
b
จะเป็นโมฆะ ฉันจะใช้คลาส RAII เพื่อรีเซ็ตเป็นค่าเก่า ในกรณีที่นิพจน์ใหม่เกิดขึ้น หากคุณต้องการพึ่งพาสิ่งนั้น - person Johannes Schaub - litb   schedule 05.11.2009