ออเปอเรเตอร์ new ใช้สำหรับจัดสรรหน่วยความจำแบบไดนามิกบน heap ออเปอเรเตอร์ delete[] ใช้สำหรับคืนหน่วยความจำนั้น new จะจัดเก็บจำนวนองค์ประกอบที่สร้างไว้ในบล็อกหัว (header block) เพื่อให้ delete[] สามารถคืนหน่วยความจำได้ถูกต้องโดยใช้จำนวนนั้น
โค้ดตัวอย่าง (Dynamic 2D Array)
#include <iostream>
using namespace std;
int main() {
int B = 4; // rows
int A = 5; // cols
int** a = new int*[B]; // อาร์เรย์ pointer ขนาด B
for(int i = 0; i < B; ++i)
a[i] = new int[A]; // แต่ละ row จัดสรรอาร์เรย์ขนาด A
// ใส่ค่า
for(int i = 0; i < B; ++i)
for(int j = 0; j < A; ++j)
a[i][j] = i;
// พิมพ์
for(int i = 0; i < B; ++i)
for(int j = 0; j < A; ++j)
cout << a[i][j] << "\n";
// ลบ: ต้องลบแต่ละ row ก่อน แล้วค่อยลบอาร์เรย์ pointer
for(int i = 0; i < B; ++i)
delete[] a[i];
delete[] a;
return 0;
}
ผลลัพธ์
0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
กลไกการทำงาน:
new T[n]จัดสรรหน่วยความจำขนาดn * sizeof(T) + overhead- Overhead (มัก 4-8 ไบต์) จัดเก็บ
n(จำนวนองค์ประกอบ) และอาจรวมขนาด/alignment delete[] ptrอ่าน overhead เพื่อรู้ว่าต้องเรียก destructor กี่ครั้ง และคืนหน่วยความจำเท่าไหร่- นี่คือเหตุผลที่ต้องใช้
delete[]สำหรับอาร์เรย์ และdeleteสำหรับวัตถุเดี่ยว - การผิดพลาดจะทำให้ memory leak หรือ undefined behavior
แนวทางปัจจุบัน: ใช้ std::vector, std::unique_ptr, std::make_unique เพื่อหลีกเลี่ยจการจัดการหน่วยความจำด้วยมือ