โดยปกติฉันจะพยายามใช้วลีที่แตกต่างกันเพื่อแยกความแตกต่างระหว่างทั้งสองให้ดีขึ้นเล็กน้อย แต่ก็เป็นคำถามที่ดีไม่ว่าในกรณีใด ๆ
Operator new เป็นฟังก์ชั่นที่จัดสรรหน่วยความจำดิบ - อย่างน้อยแนวคิดก็ไม่แตกต่างจากmalloc()
. แม้ว่าจะค่อนข้างผิดปกติเว้นแต่คุณจะเขียนบางอย่างเช่นคอนเทนเนอร์ของคุณเอง แต่คุณสามารถโทรหาโอเปอเรเตอร์ใหม่ได้โดยตรงเช่น:
char *x = static_cast<char *>(operator new(100));
นอกจากนี้ยังสามารถโอเวอร์โหลดโอเปอเรเตอร์ใหม่ได้ทั่วโลกหรือสำหรับคลาสเฉพาะ IIRC ลายเซ็นคือ:
void *operator new(size_t);
แน่นอนว่าหากคุณโหลดโอเปอเรเตอร์ใหม่มากเกินไป (ทั้งส่วนกลางหรือสำหรับคลาส) คุณจะต้องการ / จำเป็นต้องโอเวอร์โหลดตัวดำเนินการที่ตรงกันลบด้วยเช่นกัน สำหรับสิ่งที่คุ้มค่านอกจากนี้ยังมีตัวดำเนินการใหม่ [] แยกต่างหากที่ใช้ในการจัดสรรหน่วยความจำสำหรับอาร์เรย์ แต่คุณเกือบจะดีกว่าที่จะเพิกเฉยต่อความยุ่งเหยิงทั้งหมดอย่างสิ้นเชิง
ตัวดำเนินการใหม่คือสิ่งที่คุณใช้สร้างออบเจ็กต์จากร้านค้าฟรี:
my_class *x = new my_class(0);
ความแตกต่างระหว่างทั้งสองคือตัวดำเนินการใหม่จะจัดสรรหน่วยความจำดิบเท่านั้นไม่มีอะไรอื่น ตัวดำเนินการใหม่เริ่มต้นด้วยการใช้ตัวดำเนินการใหม่เพื่อจัดสรรหน่วยความจำ แต่จากนั้นจะเรียกใช้ตัวสร้างสำหรับชนิดของวัตถุที่ถูกต้องดังนั้นผลลัพธ์คือวัตถุจริงที่สร้างขึ้นในหน่วยความจำนั้น หากอ็อบเจ็กต์นั้นมีอ็อบเจ็กต์อื่น ๆ (ไม่ว่าจะเป็นแบบฝังหรือเป็นคลาสพื้นฐาน) ตัวสร้างเหล่านั้นที่เรียกใช้เช่นกัน