2017-08-03 11 views
11

Khi tạo shared_ptr bằng cách sử dụng phân bổ riêng biệt, một hàm xóa rõ ràng phải được cung cấp trong hàm C++ 14 và đặt lại hàm thành viên.Vì C++ 17 hỗ trợ shared_ptr của mảng, điều này có nghĩa là một deleter rõ ràng cho T [] không còn cần thiết trong cả ctor và reset?

using std::string; 
using std::shared_ptr; 
using std::default_delete; 
int arr_size{}; 
... 


auto string_arr_sptr_cpp14 = 
     shared_ptr<string[]>(new string[arr_size], default_delete<string[]>()); 
string_arr_sptr_cpp14.reset(new string[arr_size], default_delete<string[]>()); 
// define an explicit deleter, 
// or otherwise, "delete ptr;" will internally be used incorrectly! 

Bằng cách hỗ trợ shared_ptr tính năng mảng trong C++ 17, các cài đặt này sẽ không còn cần thiết trong cả ctor và đặt lại?

auto string_arr_sptr_cpp17 = shared_ptr<string[]>(new string[arr_size]); 
string_arr_sptr_cpp14.reset(new string[arr_size]); 
// deduced delete function calls "delete[] ptr;" correctly now? 

Trả lời

2

Bạn đang chính xác, shared_ptr<T[]> giờ đây xử lý tự động gọi delete[] đúng cách.

http://eel.is/c++draft/util.smartptr.shared#const-5

Effects: Khi T không phải là một loại mảng, xây dựng một đối tượng shared_ptr sở hữu con trỏ p. Nếu không, hãy tạo một shared_ptr sở hữu p và một dấu phân cách của một loại không xác định gọi là delete [] p.

Và như xa như reset() đi:

http://eel.is/c++draft/util.smartptr.shared#mod-3

Tương đương với shared_ptr (p) .swap (* này).

Điều gì sẽ chuyển yêu cầu tùy chỉnh theo yêu cầu đặc điểm kỹ thuật.

+0

Điều này có nghĩa rằng vai trò chính của std :: default_delete <>() cũng biến mất? – sandthorn

+1

'std :: default_delete <>()' có liên quan đến 'unique_ptr <>', đó là một vấn đề khác. – Frank

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