使用单独的分配创建shared_ptr时,必须在C++14 ctor和重置成员函数中提供显式删除函数。
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!
通过在 C++17 中支持阵列功能的shared_ptr,在 ctor 和重置中是否不再需要这些功能?
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?
你是对的,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(。
这将传输规范所需的自定义删除程序。