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ดีกว่าและควรเป็นที่ต้องการมากกว่าเสมอ