对于 new 运算符,我们有以下std::nothrow
版本:
std::unique_ptr<T> p = new(std::nothrow) T();
我们对std::make_shared
or有类似的东西std::make_unique
吗?
对于 new 运算符,我们有以下std::nothrow
版本:
std::unique_ptr<T> p = new(std::nothrow) T();
我们对std::make_shared
or有类似的东西std::make_unique
吗?
不,我们没有。make_unique
查看and的 cppreference 页面make_shared
,我们看到每个版本都使用默认new
重载。
但是,实现一个并不难,如下所示:
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)...));
}
(请注意,这个版本的make_shared_nothrow
不会像那样避免双重分配make_shared
。)C++20 为 增加了许多新的重载make_unique
,但它们可以以类似的方式实现。此外,根据评论,
使用此版本时,不要忘记在使用前检查指针。— Superlokkus 2019年 7 月 18 日在 10:46