static_assert
สามารถใช้ในการห้ามการใช้ของdelete
คำหลักวิธีนี้:
#define delete static_assert(0, "The keyword \"delete\" is forbidden.");
นักพัฒนา C ++ สมัยใหม่ทุกคนอาจต้องการทำเช่นนั้นหากต้องการใช้ตัวเก็บขยะแบบอนุรักษ์นิยมโดยใช้เฉพาะคลาส es และstruct s ที่โอเวอร์โหลดตัวดำเนินการใหม่เพื่อเรียกใช้ฟังก์ชันที่จัดสรรหน่วยความจำบนกองอนุรักษ์นิยมของตัวเก็บขยะแบบอนุรักษ์นิยมที่ สามารถเริ่มต้นและสร้างอินสแตนซ์ได้โดยการเรียกใช้ฟังก์ชันบางอย่างที่ทำสิ่งนี้ในตอนต้นของmain
ฟังก์ชัน
ตัวอย่างเช่นนักพัฒนา C ++ สมัยใหม่ทุกคนที่ต้องการใช้ตัวเก็บขยะแบบอนุรักษ์นิยมของ Boehm-Demers-Weiser จะเขียนในตอนต้นของmain
ฟังก์ชัน:
GC_init();
และในทุก ๆclass
และstruct
เกินoperator new
ด้วยวิธีนี้:
void* operator new(size_t size)
{
return GC_malloc(size);
}
และตอนนี้สิ่งoperator delete
นั้นไม่จำเป็นอีกต่อไปเนื่องจากนักเก็บขยะแบบอนุรักษ์นิยมของ Boehm-Demers-Weiser มีหน้าที่รับผิดชอบในการจัดสรรหน่วยความจำทุกบล็อกเมื่อไม่จำเป็นอีกต่อไปผู้พัฒนาต้องการห้ามdelete
คีย์เวิร์ด
วิธีหนึ่งคือใช้งานมากเกินไปdelete operator
ด้วยวิธีนี้:
void operator delete(void* ptr)
{
assert(0);
}
แต่ไม่แนะนำให้ทำเช่นนี้เนื่องจากนักพัฒนา C ++ สมัยใหม่จะรู้ว่าเขา / เธอเรียกdelete operator
ใช้เวลารันอย่างไม่ถูกต้อง แต่จะดีกว่าที่จะรู้สิ่งนี้ในเร็ว ๆ นี้ในเวลาคอมไพล์
ดังนั้นทางออกที่ดีที่สุดสำหรับสถานการณ์นี้ในความคิดของฉันคือใช้static_assert
ตามที่แสดงในตอนต้นของคำตอบนี้
แน่นอนว่าสามารถทำได้ด้วยBOOST_STATIC_ASSERT
แต่ฉันคิดว่าstatic_assert
ดีกว่าและควรเป็นที่ต้องการมากกว่าเสมอ