Chết tiệt, tôi đã bỏ lỡ toàn bộ vấn đề của câu hỏi nhưng Tôi sẽ để lại câu trả lời ban đầu của tôi như là một sidenote. Tại sao chúng ta xóa [] là bởi vì thời gian dài trước đây chúng ta đã xóa [cnt], ngay cả ngày hôm nay nếu bạn viết delete [9] hoặc delete [cnt], trình biên dịch chỉ bỏ qua điều giữa [] nhưng biên dịch ok. Vào thời điểm đó, C++ lần đầu tiên được xử lý bởi một front-end và sau đó được nạp vào một trình biên dịch C thông thường. Họ không thể làm được việc lưu trữ số lượng ở đâu đó bên dưới bức màn, có lẽ họ thậm chí không thể nghĩ về nó vào lúc đó.Và đối với tính tương thích ngược, các trình biên dịch có thể sử dụng giá trị nhất định giữa [] làm số lượng mảng, nếu không có giá trị như vậy thì chúng có số đếm từ tiền tố, vì vậy nó làm việc theo cả hai cách. Sau đó, chúng tôi đã gõ không có gì giữa [] và mọi thứ đã hoạt động. Hôm nay, tôi không nghĩ rằng "xóa []" là cần thiết nhưng việc triển khai yêu cầu nó theo cách đó.
Câu trả lời gốc của tôi (bỏ lỡ điểm) ::
"xóa" sẽ xóa một đối tượng. "delete []" xóa một mảng đối tượng. Để xóa [] để làm việc, việc thực hiện giữ số phần tử trong mảng. Tôi chỉ cần kiểm tra lại điều này bằng cách gỡ lỗi mã ASM. Trong việc thực hiện (VS2005) tôi đã thử nghiệm, số lượng được lưu trữ như là một tiền tố cho mảng đối tượng.
Nếu bạn sử dụng "xóa []" trên một đối tượng duy nhất, biến số đếm là rác để mã bị treo. Nếu bạn sử dụng "xóa" cho một mảng đối tượng, vì một số mâu thuẫn, mã bị treo. Tôi đã thử nghiệm những trường hợp này ngay bây giờ!
"xóa chỉ xóa bộ nhớ được cấp cho mảng". tuyên bố trong câu trả lời khác là không đúng. Nếu đối tượng là một lớp, xóa sẽ gọi DTOR. Chỉ cần đặt một breakpoint vào mã DTOR và xóa đối tượng, điểm ngắt sẽ nhấn. Điều gì xảy ra với tôi là, nếu biên dịch & thư viện giả định rằng tất cả các đối tượng được phân bổ bởi "mới" là mảng đối tượng, nó sẽ là OK để gọi "xóa" cho các đối tượng duy nhất hoặc mảng đối tượng. đối tượng duy nhất chỉ sẽ là trường hợp đặc biệt của một mảng đối tượng có một đếm 1. Có lẽ có cái gì đó tôi đang thiếu, dù sao ...
Thực tế, khi bạn sử dụng int mới [1] nó lưu trữ trên đầu mảng trước khi dữ liệu đầu tiên, kích thước của nó. Vì vậy, việc sử dụng xóa thay vì xóa [] sẽ không giải phóng phần bộ nhớ đó. – Rodrigo