16

Trong C++, nếu bạn muốn tự động phân bổ một mảng, bạn có thể làm một cái gì đó như thế này:Tại sao trình biên dịch yêu cầu `xóa [] p` so với` xóa p [] `?

int *p; 
p = new int[i]; // i is some number 

Tuy nhiên, để xóa các mảng, bạn làm ...

delete[] p; 

Tại sao isn' t nó delete p[]? Điều đó sẽ không cân đối hơn với cách nó được tạo ra ban đầu? Lý do (nếu có) tại sao ngôn ngữ được thiết kế theo cách này?

+8

Tại sao phiếu giảm giá/bỏ phiếu lại đóng? Tôi có thể làm gì để cải thiện câu hỏi? – Michael0x2a

+5

@Deflect: Đó là của tôi, Thông thường 'tại sao cấu trúc ngôn ngữ này được chọn?' câu hỏi đơn giản là không mang tính xây dựng bởi vì không có câu trả lời khách quan, hợp lý. Tuy nhiên, trong trường hợp này có một vài lý do khá, vì vậy tôi có thể đã đánh giá quá sớm (tôi loại bỏ downvote của tôi khá nhanh). – KillianDS

+1

@KillianDS: Được rồi, điều đó có ý nghĩa. Cảm ơn vì đã trả lời! [và trấn an tôi rằng tôi không hoàn toàn off-base :)] – Michael0x2a

Trả lời

29

Một lý do có thể khiến các trường hợp này trở nên khác biệt hơn.

int ** p; 
delete[] p 
delete p[1]; 

Nếu đó là delete p[] thì một lỗi ký tự sẽ có những điều khó chịu khá khó chịu.

+13

Điều này đặc biệt đúng, trong đó ở đầu C++, bạn phải xác định số phần tử trong '[]'. –

+4

@JamesKanze: Có vẻ như đó là câu trả lời cho tôi. 'delete p [4]' sẽ không rõ ràng. – GManNickG

+0

@GManNickG Chính xác. –

2

Vì mảng phân rã thành con trỏ khi truyền tham số thành hàm (hoặc toán tử). Vì vậy, xóa p [] sẽ chỉ đơn giản là tương đương với xóa p.

[sửa] Chúng tôi có thể nghĩ xóa là toán tử mẫu đặc biệt. Toán tử sẽ có thể phân tán giữa p và p [] để chọn đúng "chuyên môn hóa" (không phải mảng hoặc mảng bị xóa). Tuy nhiên, các quy tắc khấu trừ đối số mẫu làm cho sự lựa chọn này là không thể (do mảng phân rã chúng ta không thể phân tán giữa p [] và p khi suy luận đối số). Vì vậy, chúng tôi không thể sử dụng toán tử có tên xóa cho cả hai trường hợp và cần giới thiệu một toán tử khác [] với tên khác (hậu tố [] có thể được coi là một phần của tên toán tử) cho trường hợp mảng.

[chỉnh sửa 2] Lưu ý. xóa p [] không phải là sintax hợp lệ theo tiêu chuẩn hiện hành. Lý do ở trên chỉ cho thấy các vấn đề có thể gây ra nếu chúng ta cố gắng diễn giải xóa p [] bằng các khái niệm C++ hiện có.

+0

Không, nó không phải là tương đương. Sử dụng một nơi khác là hành vi không xác định. – sharptooth

+0

@sharptooth:? đi qua một mảng vào chức năng templated thay vì con trỏ là UB? Tôi nghĩ về xóa như về nhà điều hành templated và điều hành này không thể chọn chuyên môn phải bởi vì nó không thể distingish giữa p [] và p khi deducing các đối số.Vì vậy, chúng ta cần phải giới thiệu một toán tử đặc biệt delete [] cho mảng thay vì sử dụng cùng tên toán tử – user396672

+0

Việc truyền một con trỏ được trả về bởi 'new' thành' delete [] 'là UB – sharptooth

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