Trong khi tất cả những câu trả lời phù hợp, tôi sẽ cố gắng giải thích những gì đến một kỳ vọng, rằng một cái gì đó giống như delete[][] array;
có thể làm việc trên mảng cấp phát động và tại sao nó không thể:
Cú pháp int array[ROWS][COLS];
phép trên tĩnh mảng được phân bổ chỉ là trừu tượng đối với các lập trình viên, mà trong thực tế tạo mảng một chiều int array[ROWS*COLS];
. Nhưng trong quá trình biên dịch (khi kích thước kích thước COLS
và ROWS
phải là hằng số theo chuẩn), trình biên dịch cũng nhớ kích thước của các tham số đó, cần thiết để giải quyết các yếu tố sau này bằng cú pháp, ví dụ: array[x][y] = 45
. Trình biên dịch, được biết đến với kích thước này, sau đó sẽ thay thế [x][y]
bằng chỉ mục tương ứng thành mảng một chiều bằng cách sử dụng phép toán đơn giản: [COLS*x + y]
.
Mặt khác, đây không phải là trường hợp với động mảng được phân bổ, nếu bạn muốn có cùng chức năng đa chiều (trong ký hiệu thực tế). Vì kích thước của chúng có thể được xác định trong thời gian chạy, chúng sẽ phải nhớ kích thước của mỗi chiều bổ sung để sử dụng sau này - và hãy nhớ rằng cho toàn bộ vòng đời của mảng. Hơn nữa, các thay đổi hệ thống sẽ phải được thực hiện ở đây để làm việc với các mảng thực sự là đa chiều, để lại dạng ký hiệu truy cập [x][y]
trong mã, chứ không thay thế nó bằng ký hiệu một chiều trong khi biên dịch, nhưng sau đó thay thế nó trong thời gian chạy.
Do đó một vắng mặt của array = new int[ROWS][COLS]
ngụ ý không cần thiết cho delete[][] array;
. Và như đã đề cập, nó không thể được sử dụng trên ví dụ của bạn để xóa mảng "đa chiều" của bạn, bởi vì các mảng phụ của bạn (thứ nguyên bổ sung) được phân bổ riêng biệt (sử dụng riêng biệt gọi new
), vì vậy chúng độc lập với đầu mảng (array_2D
) có chứa chúng và tất cả chúng không thể bị xóa cùng một lúc.
Không, bạn sẽ gây ra rò rỉ bộ nhớ nếu bạn cố gắng xóa [] một mảng bị lởm chởm. –