Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Добавить std::make_unique_nothrow() и std::make_shared_nothrow() функции #573

Open
klappdev opened this issue Aug 24, 2023 · 0 comments
Labels
good first issue Несложная на вид идея. Самое то, чтобы попробовать написать на её proposal и помочь РГ21

Comments

@klappdev
Copy link

klappdev commented Aug 24, 2023

Использование std::make_unique() и std::make_shared() может привести к киданию исключение std::bad_alloc, если памяти не достаточно.
В таких случаях, необходимо использовать оператор new с std::nothrow.

#include <memory>

std::unique_ptr<T> p = new(std::nothrow) T();

Функции std::make_shared() и std::make_unique() более эффективны и могут предотвратить двойное выделения памяти.
Предлагается добавить std::make_unique_nothrow() и std::make_shared_nothrow() функции, которые можно реализовано следующим образом.

template <class T, class... Args>
std::unique_ptr<T> make_unique_nothrow(Args&&... args)
    noexcept(noexcept(T(std::forward<Args>(args)...)))
{
    return std::unique_ptr<T>(new (std::nothrow) T(std::forward<Args>(args)...));
}

template <class T, class... Args>
std::shared_ptr<T> make_shared_nothrow(Args&&... args)
    noexcept(noexcept(T(std::forward<Args>(args)...)))
{
    return std::shared_ptr<T>(new (std::nothrow) T(std::forward<Args>(args)...));
}

В библиотеке boost уже реализована подобные функции
https://www.boost.org/doc/libs/1_63_0/boost/move/make_unique.hpp

@apolukhin apolukhin added the good first issue Несложная на вид идея. Самое то, чтобы попробовать написать на её proposal и помочь РГ21 label Mar 24, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
good first issue Несложная на вид идея. Самое то, чтобы попробовать написать на её proposal и помочь РГ21
Projects
None yet
Development

No branches or pull requests

2 participants