Bây giờ thử nó bằng cách điền thông mảng với chuỗi của mỗi 100 byte, và xem nếu nó vẫn giải phóng tất cả các cấp phát bộ nhớ ...
Đó là hành vi không xác định, và như mọi khi, đôi khi UB sẽ xuất hiện làm việc. Trong trường hợp của bạn, bạn không có destructor cho các đối tượng trong bộ nhớ, do đó, không có "làm việc thêm", chỉ cần giải phóng tất cả bộ nhớ [1]. Nhưng nếu bạn có một đối tượng có một destructor mà làm một cái gì đó hữu ích, nó (có thể) sẽ không được gọi.
Bạn nên luôn sử dụng delete []
nếu bạn đã sử dụng new T[size];
để phân bổ. Đừng trộn lẫn cả hai, nó luôn luôn sai - đôi khi nó HAPPENS hoạt động [giống như MỘT SỐ kích thước của spanners in inches hoạt động trên các hạt mm và ngược lại - nhưng vẫn sai khi sử dụng một bộ cờ lê đặt trên các hạt metric].
[1] Lưu ý rằng điều này có thể làm việc cho sự kết hợp thư viện/C++ đặc biệt này. Biên dịch nó với một trình biên dịch khác, sử dụng một thư viện C++ khác, hoặc biên dịch cho một hệ điều hành khác có thể gây ra sự cố khi bạn thử cùng một thứ.
Nguồn
2013-08-04 19:15:05
AFAIK đây là UB. – Borgleader
"Tại sao tính năng này hoạt động?" - nó không, nó chỉ xuất hiện để được làm việc. –
Nếu không có dấu ngoặc đơn, bạn đang gọi chỉ là một destructor, không phải tất cả các destructors trong mảng. Ngoài ra, hãy xem http://stackoverflow.com/questions/2425728/delete-vs-delete-operators-in-c – GreatBigBore