2010-03-23 28 views

Trả lời

4

Có, đúng khi bạn sử dụng delete[] loại tĩnh của con trỏ mà bạn delete[] phải khớp với loại mảng mà bạn đã cấp phát ban đầu hoặc bạn nhận được hành vi không xác định.

Thông thường, trong nhiều lần triển khai, delete[] được gọi trên void* thực sự là một mảng của loại không có công trình hủy không tầm thường, nhưng không được đảm bảo.

delete[] buffer 

hoặc

delete[] (char*)something 

cả sẽ là hợp lệ.

5

Có.

Từ tiêu chuẩn (5.3.5 Delete):

Giá trị của toán hạng của xóa sẽ là giá trị con trỏ mà dẫn từ một mảng mới expression.72 trước) Nếu không, hành vi không xác định. [Lưu ý: điều này có nghĩa là cú pháp của biểu thức xóa phải phù hợp với loại của đối tượng được phân bổ theo mới, không phải là cú pháp của biểu thức mới. ]

Trong phương án đầu tiên (xóa đối tượng), nếu loại tĩnh của toán hạng khác với động loại của nó, loại tĩnh sẽ là một lớp cơ sở kiểu động của toán hạng và tĩnh loại phải có một destructor ảo hoặc hành vi là không xác định. Trong phương án thứ hai (xóa mảng) nếu loại động đối tượng cần xóa khác với loại kiểu tĩnh của nó, hành vi là không xác định *.

** Điều này ngụ ý rằng không thể xóa đối tượng bằng con trỏ loại void * vì không có đối tượng nào loại void.

+0

Nó không chỉ là giá trị của toán hạng đó là loại là tốt, xem đoạn tiếp theo trong 5.3.5 (3). –

+0

@Charles Bailey Đã sửa lỗi. – sinek

Các vấn đề liên quan