2015-01-07 20 views
5

Tôi tự hỏi lý do là gì đằng sau thực tế, rằng std::shared_ptr không xác định toán tử [] cho mảng. Cụ thể, tại sao std::unique_ptr có tính năng toán tử này chứ không phải std::shared_ptr?Tại sao không có toán tử [] cho std :: shared_ptr?

+3

'unique_ptr' có chuyên môn quản lý mảng,' shared_ptr' không. 'toán tử []' chỉ được cung cấp cho chuyên môn đó. Bạn có hỏi tại sao 'shared_ptr' không có cái đó? – juanchopanza

+2

Tôi hy vọng điều này sẽ trả lời câu hỏi của bạn http://stackoverflow.com/questions/8947579/why-isnt-there-a-stdshared-ptrt-specialisation – Swtsvn

+0

@juanchopanza Tôi cho là vậy. – Haatschii

Trả lời

10

std::unique_ptr chỉ xác định operator[] trong chuyên môn cho mảng: std::unique_ptr<T[]>. Đối với con trỏ không có mảng, toán tử [] không có ý nghĩa gì nhiều (chỉ có [0]).

như một chuyên môn hóa cho std::shared_ptr là mất tích (trong C++ 11), được thảo luận trong các câu hỏi liên quan: Why isn't there a std::shared_ptr<T[]> specialisation?

Bạn không nên sử dụng một con trỏ thông minh phi mảng với mảng phân bổ, trừ khi bạn cung cấp một tùy chỉnh deleter. Cụ thể, unique_ptr<int> p = new int[10] là xấu, vì nó gọi delete thay vì delete[]. Thay vào đó, hãy sử dụng unique_ptr<int[]>, gọi số delete[]. (Và điều này thực hiện operator[]). Nếu bạn đang sử dụng shared_ptr để giữ T[], bạn cần phải sử dụng một deleter tùy chỉnh. Xem thêm shared_ptr to an array : should it be used? - nhưng nó không cung cấp operator[], vì nó sử dụng loại xóa để phân biệt giữa mảng và không mảng (kiểu con trỏ thông minh độc lập với dấu phân cách được cung cấp).

Nếu bạn tự hỏi tại sao không có shared_ptr chuyên môn cho các mảng: đó là một đề nghị, nhưng không được bao gồm trong tiêu chuẩn (chủ yếu là từ bạn có thể làm việc xung quanh bằng cách viết ptr.get() + i cho ptr[i]).

+2

'shared_ptr' sử dụng' delete' _you_ cung cấp (nếu bạn cung cấp một); nó hoàn toàn có thể cung cấp một cái gì đó như '[] (T * p) {delete [] p; } '. –

+0

Vâng, đó là chủ yếu liên quan đến 'unique_ptr', kể từ khi thay đổi deleter cho con trỏ đó thay đổi loại (không có loại tẩy xoá ở đó). Và đối với 'shared_ptr', chúng ta đã có một chuyên môn xử lý' delete [] '. – leemes

+0

@JamesKanze Cập nhật, tôi hy vọng nó rõ ràng hơn bây giờ ... – leemes

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