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



使用单独的分配创建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(。

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

相关内容

  • 没有找到相关文章

最新更新