“std::size_t huge = static_cast<std::size_t>(-1); ::operator new(huge);” 在 throw_std_bad_alloc 中解决了什么问题?

what problem does "std::size_t huge = static_cast<std::size_t>(-1); ::operator new(huge);" solve in throw_std_bad_alloc?

提问人:sophistcxf 提问时间:11/3/2023 更新时间:11/3/2023 访问量:123

问:

为什么这样写这段代码,要解决什么问题?

“::operator new(huge);”似乎会导致内存泄漏。

EIGEN_DEVICE_FUNC 
inline void throw_std_bad_alloc()
{
  #ifdef EIGEN_EXCEPTIONS
    throw std::bad_alloc();
  #else
    std::size_t huge = static_cast<std::size_t>(-1);
    ::operator new(huge);
  #endif
}

C++ 特征

评论

0赞 463035818_is_not_an_ai 11/3/2023
你知道什么是吗?static_cast<std::size_t>(-1)
5赞 HolyBlackCat 11/3/2023
throw_std_bad_alloc()对我来说听起来不言自明。据推测,当异常被禁用时,无效调用会以某种方式终止程序。operator new
0赞 WhozCraig 11/3/2023
你真正的问题是为什么还不够充分,而不必跳过创建一个无法实现的内存分配请求来实现这个目标的箍?throw std:bad_alloc();
0赞 463035818_is_not_an_ai 11/3/2023
@WhozCraig这是我的问题,至少;)。无论如何都不扔?那么为什么会出现这两种情况呢?newbad_alloc
5赞 StoryTeller - Unslander Monica 11/3/2023
@463035818_is_not_an_ai - 它不只是扔,不。该行为可以自定义 en.cppreference.com/w/cpp/memory/new/set_new_handler - 实际上,“异常禁用”构建将终止。

答:

8赞 Ted Lyngmo 11/3/2023 #1

该函数被设置为在内存分配失败时引发异常或执行任何操作。

如果定义,它将抛出一个正常值,但在另一种情况下,它将尝试分配字节(这就是结果),假设它总是失败,因此不会有泄漏。如果异常被关闭,它很可能是程序。EIGEN_EXCEPTIONSstd::bad_allocstd::numeric_limits<std::size_t>::max()static_cast<std::size_t>(-1)abort()