【问题标题】:Does std::malloc return NULL or nullptr on failurestd::malloc 在失败时是否返回 NULL 或 nullptr
【发布时间】:2018-03-15 08:28:57
【问题描述】:

根据http://en.cppreference.com/w/cpp/memory/c/malloc std::malloc 在失败时返回一个空指针

这是一个 NULL 指针还是一个 nullptr?

如果它是 nullptr,则意味着 std::malloc 和 C malloc 之间存在差异。那么接下来的另一个问题,在那种情况下,还有其他的不同吗?

编辑: 这不是评论中建议的重复。这就解释了 nullptr 是什么,清楚地表明它们是不同的。问题不是问它们之间的区别。

【问题讨论】:

  • NULLnullptr 没有区别在这种情况下
  • What exactly is nullptr?的可能重复
  • @Fatih,感谢您的评论。然而,它给我们留下了更多的疑问。为什么,谁来决定,...
  • @Makketronix,谁决定什么? NULLnullptr 等价于从函数返回的指针的值?在那种情况下我会说标准化委员会
  • @Fatih,当然委员会决定了......无论如何,感谢您的努力。

标签: c++ malloc


【解决方案1】:

它返回NULL。来自 C++ 标准的 N4296 草案:

20.7.13 C 库 [c.malloc]

  1. 表 45 描述了标头 <cstdlib>

    表 45 - 标题 <cstdlib> 概要:

    +------------+---------------+
    | Type       | Name(s)       |
    +------------+---------------+
    | Functions:   calloc malloc |
    |              free realloc  |
    +----------------------------+
    
  2. 内容与标准 C 库头文件 11 相同,但有以下变化:
  3. 函数calloc()malloc()realloc() 不会尝试通过调用::operator new() (18.6) 来分配存储空间。
  4. 函数free() 不会尝试通过调用::operator delete() 来释放存储空间。
  5. 直接使用malloc()calloc()realloc() 分配的存储在分配时被隐式声明为可达(见3.7.4.3),在解除分配时不再被声明为可达,并且不需要不再被声明为可达undeclare_reachable() 调用的结果。

如您所见,C++ 标准将malloc 的定义委托给C 标准,并且对其返回值或类型没有进一步限制。由于 C 有NULL 但没有nullptr,我们可以肯定地说malloc 返回NULL

但所有这些都没有实际意义,因为NULL == nullptr 总是正确的,因为它们都是“空指针常量”(这个术语在 4.10 指针转换 [conv.ptr] 中有明确定义)。两者是等价的。

【讨论】:

  • 如果可以的话,我会付出更多,来展示 N4296。教人钓鱼……
  • @Makketronix 左侧边栏在徽标的正下方,您会发现当前标准草案的链接:isocpp.org 想想看,那个网站上有很多很酷的东西。
【解决方案2】:

都没有。

返回类型是std::mallocvoid*。分配失败的返回值为void*类型的空指针值

NULL 是一个预处理器宏。宏本身没有类型或值。该宏可以定义为nullptr0。所以我们不能真的说std::malloc返回NULL。我们可以说它返回的值等于从 NULL 解析的值可转换的值。

虽然nullptr 是一个“空指针文字”,但它本身并不是一个指针。它的类型不是传统的指针类型。奇怪的是,它的类型是decltype(nullptr),它不是std::malloc 的返回类型。所以std::malloc 不会返回nullptr

【讨论】:

  • 感谢您澄清术语。
【解决方案3】:

std::malloc 首先返回一个指针。 nullptr 不是指针(这就是它的全部意义)。所以std::malloc不能返回nullptr

失败时,std::malloc 将返回一个指针值,该值被定义为“空指针常量”。 nullptr 是一种非指针类型,可以隐式转换为“空指针常量”,并且可以与任何指针值相等比较(如果指针值是“空指针常量”,则返回等于)。

因此,如果您针对nullptr 测试返回值,当且仅当std::malloc 失败时,它才会测试为真。

NULL 在整数文字 0 中产生 (for C++)(注意:它也可以产生 nullptr,但几乎没有实现这样做)。根据 C++ 的规则,整数文字 0 可以隐式转换为空指针常量,并且可以与任何指针值进行比较(如果指针值是“空指针常量”,则结果为等于)。

因此,如果您针对NULL 测试返回值,当且仅当std::malloc 失败时,它才会测试为真。

【讨论】:

  • 好的,所以 malloc 失败了。寄存器 EAX/RAX 的值是多少?那会是 0,还是会是一个内存位置?
  • @Makketronix:该值是实现定义的“空指针常量”。标准没有定义实现给这个值的值。但大多数平台确实会选择一个转换为 uintptr_t 值 0 的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
  • 2011-10-16
  • 2014-02-14
  • 1970-01-01
  • 2021-09-27
  • 2015-12-03
相关资源
最近更新 更多