Khi dùng new[] cấp phát mảng, trình biên dịch/run-time lưu trữ số lượng phần tử (hoặc kích thước byte) trong một header ẩn trước địa chỉ trả về. delete[] đọc header này để biết bao nhiêu destructor cần gọi và bao nhiêu bộ nhớ giải phóng.
Ví dụ: Mảng 2D động (mảng con trỏ)
#include <iostream>
using namespace std;
int main() {
const int ROWS = 4, COLS = 5;
int** a = new int*[ROWS]; // cấp phát mảng con trỏ hàng
for (int i = 0; i < ROWS; ++i)
a[i] = new int[COLS]; // cấp phát từng hàng
// Khởi tạo
for (int i = 0; i < ROWS; ++i)
for (int j = 0; j < COLS; ++j)
a[i][j] = i;
// In
for (int i = 0; i < ROWS; ++i) {
for (int j = 0; j < COLS; ++j)
cout << a[i][j] << ' ';
cout << '\n';
}
// Giải phóng: XÓA TỪNG HÀNG TRƯỚC, SAU ĐÓ XÓA MẢNG CON TRỎ
for (int i = 0; i < ROWS; ++i)
delete [] a[i];
delete [] a;
return 0;
}
Kết quả
0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
Quan trọng: Mỗi new[] phải có đúng một delete[] tương ứng. Với mảng 2D kiểu int**, phải xóa từng hàng trước, rồi xóa mảng con trỏ hàng.