由于C++ 17支持数组的shared_ptr,这是否意味着在ctor和reset中都不再需要T []的显式删除器?

san*_*orn 12 c++ arrays shared-ptr c++17

使用分离的分配创建shared_ptr时,必须在C++ 14 ctor和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!
Run Code Online (Sandbox Code Playgroud)

通过在C++ 17中支持数组特性的shared_ptr,ctor和reset都不再需要那些?

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?
Run Code Online (Sandbox Code Playgroud)

Fra*_*ank 5

你是对的,shared_ptr<T[]>现在自然可以正确处理调用delete[]

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

效果:当 T 不是数组类型时,构造一个拥有指针 p 的 shared_ptr 对象。否则,构造一个拥有 p 的 shared_ptr 和一个调用 delete[] p 的未指定类型的删除器

就目前reset()而言:

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

等效于 shared_ptr(p).swap(*this)。

这将传输规范所需的自定义删除器。