2012-06-12 24 views
5

Có khó khăn trong việc thực hiện xóa mảng bằng một từ khóa không? Nó kém hiệu quả hơn?Tại sao C++ vẫn có một toán tử xóa [] và xóa?

+3

Tôi ngần ngại đánh dấu điều này là * Không phải là một câu hỏi thực tế *, mặc dù có lẽ không quá phrased, nó yêu cầu những thách thức kỹ thuật đằng sau sự thống nhất; Tôi tin rằng những điều đó có thể được giải quyết. –

+0

Câu hỏi liên quan: http://stackoverflow.com/q/703691/10077 –

Trả lời

-3

Các tính năng như thế này không chỉ bị xóa khỏi sự kiện ngôn ngữ nếu nó dễ thực hiện. Bạn có tình nguyện đến và sửa tất cả mã của tôi sau sự thay đổi đó không?

+1

Chúng có thể đã không dùng cú pháp 'delete []' nếu nó đã lỗi thời mà không làm mất nó, và có một sự triển khai thực hiện phù hợp với nhau. –

+0

Không có vấn đề gì khi bỏ 'auto_ptr' –

+0

' auto_ptr' là một lớp thư viện, không phải ngôn ngữ xây dựng, vì vậy nó không giống nhau, và bắt buộc phải làm phức tạp tính năng hữu ích là hoàn toàn ngu ngốc, nếu bạn hỏi tôi. –

6

Vấn đề không phức tạp, nhưng thực tế là đối số cho delete là một con trỏ duy nhất và loại đó giống hệt nhau dù bạn đã phân bổ một phần tử hay một mảng. Bên dưới việc thực hiện khá khác nhau, vì số lượng các phần tử bị phá hủy khác nhau. Đây thực sự là một vấn đề với khả năng tương thích ngược với C ... nếu đó không phải là một yêu cầu ngay từ đầu chúng tôi có lẽ sẽ không có C++ (nó sẽ không bị bắt quá nhiều) nhưng loại new T[N] có thể khác với loại new T và hệ thống kiểu có thể được sử dụng để phát hiện cần delete gọi nào.

+1

Tôi đoán OP thực sự hỏi tại sao 'new T' lại khác với' new T [1] '. –

+0

Điều gì có thể khiến người ta phải hỏi, "Nếu tôi là' mới'ing một mảng Gizmos, liệu tôi có thực sự muốn gọi người xây dựng chỉ là người đầu tiên không? " –

+2

@OliCharlesworth Như tôi đã nói trong câu trả lời của tôi: 'new T [1]' có thêm chi phí, và bạn không cần phải trả tiền cho những gì bạn không sử dụng. –

16

Trước tiên, hãy để tôi tóm tắt những gì cả hai thực hiện: delete gọi hàm hủy cho một đối tượng và deallocates bộ nhớ; delete[] gọi hàm hủy của một số đối tượng và giải phóng bộ nhớ.

Người ta có thể gấp những thứ này vào cùng một thao tác: "gọi hàm hủy của một số đối tượng và giải phóng bộ nhớ.". Sau tất cả mộtmột số số.

Cả hai deletedelete[] hoạt động trên con trỏ. Như thế này:

foo* ptr; 

Xem xét kỹ. Và cho tôi biết có bao nhiêu destructors nên được gọi khi chúng tôi delete nó. Bạn không thể. Và vì vậy không thể trình biên dịch. Điều này chỉ có thể được biết khi chạy. Thông tin về số lượng đối tượng phải được lưu trữ ở đâu đó. Điều đó có nghĩa là, đối với mỗi lần sử dụng new[], có một số bộ nhớ bổ sung được phân bổ để theo dõi số đó.

C++ được xây dựng trên nguyên tắc "bạn không trả tiền cho những gì bạn không sử dụng", và đó là lý do tại sao các biểu mẫu không tồn tại: vì delete luôn chỉ xóa một đối tượng, new không cần phân bổ thêm bất kỳ.

+0

Chính xác hơn, đây là sự cố cũ. Nó sẽ là tầm thường để làm 'delete (1, ptr)' và 'delete (expression, ptr);' Mọi người đều biết có bao nhiêu phần tử mà chúng có. – Puppy

+2

Malloc biết số lượng bộ nhớ được phân bổ cho yêu cầu phân bổ. 'delete' có thể đã tham khảo thông tin tương tự. – jxh

+0

@ user315052 Vậy thì sao? 'malloc' không phải là' mới'. Bạn không thể 'xóa' một cái gì đó bạn' malloc'ed. –

5

Đó là vì một trong những nguyên tắc quan trọng của thiết kế C++ là bạn không trả tiền cho những gì bạn không sử dụng. new[]/delete[] có thêm chi phí, và cảm thấy tiện ích của mình (tôi chưa bao giờ sử dụng sau đó trong 25 năm C++.) Bị giới hạn đủ để không thêm chi phí này vào không phải là mảng new/delete .

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