Так как С++ 17 поддерживает shared_ptr массива, означает ли это, что явный делектор для T [] больше не требуется как для ctor, так и для reset?
При создании shared_ptr с использованием выделенного выделения в С++ 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!
Поддерживая функцию shared_ptr для массива в С++ 17, будут ли они больше не нужны как для 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?
Ответы
Ответ 1
Вы правы, shared_ptr<T[]>
теперь, естественно, правильно обрабатывает delete[]
.
http://eel.is/c++draft/util.smartptr.shared#const-5
Эффекты: Когда T не является типом массива, создается объект shared_ptr, которому принадлежит указатель p. В противном случае создается shared_ptr, которому принадлежат p и удалённость неуказанного типа, который вызывает delete [] p.
И что касается reset()
:
http://eel.is/c++draft/util.smartptr.shared#mod-3
Эквивалент shared_ptr (p).swap(* this).
Будет передан требуемый спецификацией пользовательский отладчик.