Страницы

Поиск по вопросам

среда, 17 октября 2018 г.

Почему shared_ptr запрещает неявное преобразование указателя?

Этот код не компилируется:
std::shared_ptr pi = new MyType[5];
Вместо этого, так как конструктор shared_ptr объявлен explicit - приходится писать:
std::shared_ptr pi(new MyType[5]);
Я нахожу это как минимум неудобным.
В чём причины такого дизайна ?
И какой от этого профит ?


Ответ

Допустим у нас есть функция, принимающая умный указатель:
void foo(std::shared_ptr data){ //... }
Тогда такой код приведет к удалению ресурса, хотя мы этого не подразумевали:
MyType *object = new MyType(); foo(object);
При вызове функции выполнится создание умного указателя, а при выходе из неё он удалит тот объект которым владел. И все это скомпилируется без каких либо предупреждений.

Комментариев нет:

Отправить комментарий