Домівка > C++ > Навіщо потрібен make_unique

Навіщо потрібен make_unique

make_unique завжди варто і завжди правильно використовувати у коді тим більше, що він не має ніякого негативного впливу на швидкодію.

Убезпечення від виняткових ситуацій у випадках з неіменованими тимчасовими змінними

f(make_unique<T>(), function_that_can_throw());

Проти:

f(unique_ptr<T>(new T), function_that_can_throw());

У другому випадку компілятору дозволено виконувати дії у такому порядку:

new T                     // Створити неіменовану тимчасову змінну
function_that_can_throw() // Тут може виникнути виняткова ситуація
unique_ptr<T>(...)        // Якщо на попередньому кроці мала місце виняткова ситуація, 
                          // то ми не маємо можливості вивільнити пам'ять

Очевидно, що якщо функція function_that_can_throw дійсно кине виняткову ситуацію, то має місце витік пам’яті. make_unique запобігає цьому.

Можливість повністю відмовитись від використання оператора new

Поява make_unique нарешті дає можливість сказати програмістам ніколи не використовувати new, натомість раніше правило щодо new було таке: “ніколи не використовувати окрім випадків коли ви створюєте unique_ptr“.

Насправді, це не зовсім так, якщо вам необхідно створити unique_ptr використовуючи користувацький deleter, то вам доведеться використати new.

auto mytypeDeleter = [](Mytype* p) { … };
unique_ptr<Mytype, decltype(mytypeDeleter)> up(new Mytype, mytypeDeleter);

Немає потреби двічі писати назву типу

std::unique_ptr<YourType> p(new YourType(params));

трошки багатослівно, чи не було б краще?

auto p = std::make_unique<YourType>(params);

A от і варіант з масивами:

auto data = std::unique_ptr<unsigned char[]>{ new unsigned char[10000] };
auto data = std::make_unique<unsigned char[]>( 10000 ); // Додано в C++ 14
vector<int>

Ну, і на додачу:) Якщо ви хочете створити вектор з int‘ів, який містить 10 одиничок, то використайте

make_unique<std::vector<int>>(10, 1);

Якщо ж ви хочете створити вектор з двома елементами 10 і 1, то робіть так

auto init_list = { 10, 1 };
make_unique<std::vector<int>>(init_list);
Advertisements
Категорії:C++ Позначки:,
  1. Коментарів ще немає.
  1. No trackbacks yet.

Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: