2015-09-22 17 views
7

tôi đã tự hỏi tại sao các mảng động được hỗ trợ trực tiếp bởi std::unique_ptr<> nhưng không phải bởi std::shared_ptr<>:Tại sao không có chuyên môn cho std :: shared_ptr <T[]>?

unique_ptr<int[]> ptr1(new int[n]); /// OK! 
shared_ptr<int[]> ptr2(new int[n]); /// Incorrect: will not call delete[] 

Cập nhật: tôi phát hiện ra rằng dòng thứ hai có thể được viết lại như sau:

shared_ptr<int> ptr2(new int[n], default_delete<int[]>()); 

Bây giờ tôi Tôi tự hỏi điều gì đang xảy ra đằng sau hiện trường làm cho std::shared_ptr hoạt động với phương pháp thứ hai và không giống như cách thức tương tự với std::unique_ptr?

+0

Bạn nhận được thông báo lỗi nào? –

+0

Nó không phải về thông báo lỗi, đó là về tính chính xác của dòng thứ hai vì nó không gọi xóa [] – Vahid

+0

Bạn không phải chỉ định một deleter với 'unique_ptr ' (tức là 'deleter' tham số mẫu không có mặc định)? Điều đó ít nhất là những gì được đề xuất [ở đây] (http://en.cppreference.com/w/cpp/memory/unique_ptr) nếu không nhầm. – Walter

Trả lời

3

Với shared_ptr bạn phải sử dụng trình chỉnh sửa tùy chỉnh yêu cầu delete[], nếu bạn phân bổ mảng bằng new[].

Ngoài ra, bạn phải cẩn thận với việc truyền lên và xuống giống như với con trỏ thô, để không gọi hành vi không xác định.

unique_ptr có hỗ trợ trực tiếp cho mảng, để khi biết rằng nó giữ con trỏ đến mảng bạn không thể lên hoặc xuống, và trình gỡ rối mặc định gọi delete[].

+3

Tôi hiểu điều đó, nhưng có phải do hạn chế của shared_ptr mà nó không thể sử dụng xóa []? – Vahid

+1

@Vahid: 'shared_ptr' đến từ thư viện Boost, cũng có [' shared_array'] (http://www.boost.org/doc/libs/1_59_0/libs/smart_ptr/shared_array.htm). Nó được cho là một bộ phận sạch hơn so với các chuyên ngành của 'unique_ptr'. Nhưng nó có nghĩa là 'shared_ptr', theo thiết kế, không tích cực hỗ trợ mảng. Bạn phải cajole nó vào nó, ví dụ bằng cách sử dụng một deleter tùy chỉnh. –

+0

Vì vậy, lý do là vì khả năng tương thích với tăng lib, và vì 'shared_array' chưa được chuyển đến STL, phải không? – Vahid

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