Khi phân bổ được thực hiện, một phần nhỏ bộ nhớ ngay trước [hoặc, về mặt kỹ thuật, ở đâu đó hoàn toàn khác, nhưng trước đây là trường hợp phổ biến nhất] sẽ lưu trữ kích thước phân bổ và trong trường hợp new []
cũng lưu trữ số lượng các đối tượng được phân bổ. Lưu ý rằng tiêu chuẩn C++ không cung cấp bất kỳ cách nào để lấy thông tin này vì một lý do: Nó có thể không mô tả chính xác những gì được phân bổ, ví dụ kích thước của một mảng có thể được làm tròn thành một số "đẹp" ranh giới [hầu như tất cả các bộ phân bổ hiện đại có kích thước tối thiểu là 16 byte, do đó bộ nhớ có thể sử dụng cho SSE và các triển khai SIMD tương tự khác trên các kiến trúc bộ vi xử lý khác]. Vì vậy, nếu bạn phân bổ 40 byte, nó sẽ báo cáo lại 48, mà không phải là những gì bạn yêu cầu, do đó, nó sẽ được khá khó hiểu. Và tất nhiên, không có gì đảm bảo rằng thông tin được lưu trữ tại TẤT CẢ - nó có thể được ngụ ý bởi một số thông tin khác được lưu trữ trong khối "quản trị" của phân bổ. Và tất nhiên, bạn có thể sử dụng vị trí new
, trong trường hợp không có khối quản trị và phân bổ không bị xóa theo cách thông thường - một số mã tùy ý sẽ không thể cho biết sự khác biệt.
delete
khác với delete []
trong đó delete []
sẽ biết số lượng đối tượng đã được phân bổ và gọi hàm hủy cho tất cả các đối tượng đó. Nó cũng có thể [hoặc thậm chí có khả năng] rằng new []
lưu trữ số lượng các yếu tố theo cách có nghĩa là gọi delete []
vào thứ gì đó không được tạo ra với new []
sẽ bị lỗi nghiêm trọng. Và như Zan Lynx nhận xét, rằng nếu không có destructor cho các đối tượng (ví dụ: khi bạn đang phân bổ dữ liệu cho int
hoặc struct { int x; double y; }
, v.v. - bao gồm các lớp không có hàm tạo lớp bên trong lớp, trình biên dịch sẽ xây dựng một destructor cho bạn]), sau đó không cần phải lưu trữ số, hoặc làm bất cứ điều gì khác, vì vậy trình biên dịch CÓ THỂ, nếu nó muốn, tối ưu hóa phân loại này vào thường xuyên new
và delete
.
Nguồn
2014-10-16 20:08:07
http://stackoverflow.com/questions/197675/how-does-delete-know-the-size-of-the-operand-array – taocp
Đó là trình quản lý bộ nhớ OS đang xử lý mọi thứ. – dtech
Đối với mảng, trình biên dịch C++ và thời gian chạy có quyền truy cập "riêng tư" đối với mảng dài bao lâu để gọi số lượng các trình phá hủy thích hợp nếu cần thiết. Ngoài ra http://stackoverflow.com/questions/11049144/is-the-size-of-a-dynamically-allocated-array-stored-somewhere/11049350#11049350 – dtech