Nếu chúng ta phân bổ một đối tượng có kích thước 1 như sauTôi có thể sử dụng `toán tử xóa []` để phân bổ mảng phần tử đơn lẻ không?
int *arr = new int[1];
Chúng ta có nên xóa các đối tượng sử dụng operator delete[]
hoặc operator delete
?
Lý do tôi quan tâm là nếu trình biên dịch đủ thông minh để chuyển đổi câu lệnh dưới dạng phân bổ phần tử đơn lẻ int *arr = new int
, điều này sẽ gây ra việc gọi số operator delete[]
UB.
Trường hợp người dùng:
Tôi có một con trỏ, thứ mà tôi sẽ phân bổ theo nhiều cách khác nhau nhưng cuối cùng cũng muốn xóa nó. Vì vậy, đã tự hỏi, đối với việc phân bổ các yếu tố duy nhất, nếu tôi liên tục sử dụng int *arr = new int[1]
tôi có thể liên tục và an toàn sử dụng operator delete[]
Note
Bạn có thể vui lòng tham khảo tôi trở lại với các tiêu chuẩn để hỗ trợ câu trả lời của bạn?
'toán tử xóa []' tất nhiên. 'int [1]' không phải là 'int'. Trình biên dịch * đủ thông minh * sẽ không chuyển đổi câu lệnh. – johnchen902
Đó là cùng một vị trí trong tiêu chuẩn cho phép bạn gọi 'delete []' sau 'new [] '. không có trường hợp đặc biệt nào cho kích thước 1. – juanchopanza
* Nếu * trình biên dịch * đủ thông minh để làm điều đó (mặc dù thay đổi một kiểu khác không liên quan gì đến thông minh), nó sẽ phải thông báo cho bạn về điều này thay đổi hoặc thay đổi này sẽ phải được xác định trong tiêu chuẩn và trong trường hợp này, nó cũng sẽ không thông minh, nhưng bắt buộc. Nếu nó âm thầm sau lưng thì trình biên dịch đó không thông minh nhưng * cố ý xấu xa *. Không cần cho bất kỳ tài liệu chuẩn nào ngoài dạng thức thông thường, một 'int' chỉ * không giống * như một' int [1] '. Là một mảng một phần tử vẫn là một mảng (gợi ý: câu trả lời ẩn trong bình luận này)? –