2011-07-21 3 views
6

20.6.9:Cấp phát mặc định C++ - điều gì sẽ xảy ra nếu kích thước không bằng kích thước được truyền cho lời gọi cấp phát?

void deallocate(pointer p, size_type n); 
  • Yêu cầu: p phải là một giá trị con trỏ lấy từ phân bổ(). n sẽ bằng giá trị được chuyển như đối số đầu tiên cho lời gọi phân bổ trả về p.
  • Hiệu ứng: Phân bổ dung lượng được tham chiếu bằng p.
  • Ghi chú: Sử dụng :: toán tử xóa (void *) (18.6.1), nhưng không xác định khi hàm này được gọi.

Điều gì sẽ xảy ra nếu n không bằng giá trị được chuyển làm giá trị đầu tiên cho yêu cầu phân bổ trả lại p? Không deallocate? Ném std::bad_alloc? ...

CHỈNH SỬA: Điều tôi thực sự muốn nói với "điều gì sẽ xảy ra" là: Có thể ném hoặc khẳng định trong triển khai tùy chỉnh không?

Trả lời

10

Như thường lệ trong C++ Standard, khi không có gì được nêu rõ ràng, vi phạm các yêu cầu dẫn đến hành vi không xác định. Shall có nghĩa là mọi lúc phải, đó là một yêu cầu, không phải là một tùy chọn trong C++ Standard.

Ví dụ ở đây là những gì MSDN says:

Con trỏ _Ptr phải đã được trả lại trước đó bởi một cuộc gọi để phân bổ cho một đối tượng cấp phát so sánh tương đương với * này, phân bổ một đối tượng mảng có cùng kích thước và kiểu .

có nghĩa là kích thước phải khớp chính xác, nếu không bạn sẽ gặp phải hành vi không xác định.

+2

Btw .: Việc triển khai Microsoft bỏ qua kích thước đã qua ... – 0xbadf00d

+1

@FrEEzE - Việc triển khai có thể bỏ qua tham số vì nó biết nó ** có **. Các triển khai khác có thể sử dụng nó, nếu chúng không nhớ chính kích thước phân bổ. –

+0

Bỏ qua kích thước là một trong các loại hành vi không xác định hợp lệ. –

3

Nó không nói. Điều đó có nghĩa rằng nó sẽ là "khó chịu không xác định".

+0

Vâng, tôi biết. Nhưng tôi muốn biết nếu nó sẽ là okay để ném hoặc khẳng định (trong một triển khai tùy chỉnh) khi kích thước không phù hợp với kích thước được phân bổ. – 0xbadf00d

+2

Nếu nó không xác định, bạn có thể làm bất cứ điều gì bạn muốn. Các thùng chứa tiêu chuẩn chắc chắn sẽ vượt qua giá trị chính xác. Đối với vùng chứa của riêng bạn ** bạn ** có thể xác định hành vi. :-) –

1

Điều này có trong tiêu chuẩn để cho phép các trình phân bổ cơ bản không biết kích thước của phân bổ từ con trỏ của nó. Ví dụ, phân bổ AmigaOS duy trì một danh sách các khối bộ nhớ miễn phí và thậm chí cho phép deallocation một phần (tức là nếu tôi phân bổ 1024 byte, sau đó miễn phí 512 byte tại 256 bù đắp, tôi kết thúc với hai phân bổ 256 byte), do đó, người cấp phát mong muốn tôi chuyển thông tin này cho người deallocator.