2012-01-20 45 views
61

Tiêu chuẩn cung cấp một mẫu chuyên môn của std::unique_ptr đó một cách chính xác gọi là delete[] từ destructor của nó:Tại sao không có chuyên môn :: shared_ptr <T[]>?

void func() 
{ 
    std::unique_ptr<int[]> arr(new int[10]); 

    ....... 
} 

Với std::shared_ptr chuyên môn hóa này không có sẵn, vì vậy nó là cần thiết để để cung cấp một deleter đó một cách chính xác gọi delete[]:

void func() 
{ 
    // Usage 
    shared_ptr array (new double [256], [](double* arr) { delete [] arr; }); 

    .............. 
} 

Đây có phải chỉ là sự giám sát không? (giống như cách có một số std::copy_if) hoặc có lý do gì không?

+3

N.B. có đề xuất mới để thêm mục này cho C++ 17, dựa trên công việc trong Boost, xem http://open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3640.html –

+0

Lưu ý rằng rất nhiều của máy chủ 'shared_ptr' sẽ bị vô hiệu hóa khi làm việc với các mảng, chẳng hạn như khả năng tham chiếu đến một subobject. –

Trả lời

65

LWG (Nhóm làm việc thư viện của ủy ban C++) đã nhanh chóng xem xét khả năng nhưng ý tưởng không phải là không có tranh cãi. Mặc dù tranh cãi chủ yếu là về một tính năng được thêm vào đề xuất shared_ptr<T[]> có thể đã bị hủy bỏ (số học trên shared_ptr<T[]>).

Nhưng cuối cùng lý do thực sự là mặc dù nó đã được thảo luận, chưa bao giờ có một đề xuất bằng văn bản thực tế ở phía trước của LWG để làm điều này. Nó không bao giờ nổi lên danh sách ưu tiên của bất kỳ ai (kể cả của riêng tôi) đủ để đặt thời gian vào việc viết một đề xuất.

Cuộc hội thoại không chính thức gần đây đã bắt đầu một lần nữa về chủ đề này trong số ít thành viên LWG và tôi đã tự tạo mẫu cho nó. Nhưng vẫn không có đề xuất bằng văn bản cho nó. Tôi nghĩ rằng nó sẽ là một công cụ bổ sung phong nha trong hộp công cụ. Cho dù điều đó có thực sự xảy ra hay không thì bất cứ ai cũng đoán được.

Cập nhật

mảng hỗ trợ cho shared_ptr bây giờ có một dự thảo TS:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4077.html

Update (2017)

này hiện nay được hỗ trợ trong C++ 17. Xem trường hợp 3 của shared_ptr::shared_ptr()

+2

Đầu tiên "tại sao không có ..." câu hỏi với một câu trả lời thực sự mà tôi đã nhìn thấy, cũng, một mảng động được phân bổ? Với vector và std :: mảng, thực sự không thấy sự cần thiết (?) – Nim

+12

@Nim: 'std :: unique_ptr ' (tồn tại) là tốt cho khi chi phí cực kỳ quan trọng đối với bạn. Không giống như 'vector ', 'unique_ptr ' không bao gồm chi phí cho dung lượng hoặc thậm chí là kích thước. Khách hàng có thể sẽ cần phải thêm chi phí bên ngoài cho kích thước, nhưng nếu mảng không bao giờ được thay đổi kích cỡ, không phải cho dung lượng. Bây giờ điều này không làm cho 'unique_ptr ' một 'vector tốt hơn '. Thật vậy, tôi nghĩ rằng các trường hợp sử dụng của cựu sẽ là hiếm so với sau này. Nhưng tỷ lệ sử dụng không phải là 0. –

+3

Tương tự, 'shared_ptr ' đôi khi có thể thay thế 'shared_ptr >' với chi phí thấp hơn. Sự tồn tại duy nhất và tiếp tục hỗ trợ 'boost :: shared_array ' là một lập luận rằng một số lập trình viên tìm thấy một công cụ như vậy đôi khi hữu ích. –

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