std :: malloc在失败时返回NULL或nullptr

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

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

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

编辑:这是不重复的建议在评论中。 这解释了nullptr是什么,明确地说它们是不同的。 问题不在于询问它们之间的区别。


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

20.7.13 C库[c.malloc]

  • 表45描述了头文件<cstdlib>

    表45 - Header <cstdlib>摘要:

    +------------+---------------+
    | Type       | Name(s)       |
    +------------+---------------+
    | Functions:   calloc malloc |
    |              free realloc  |
    +----------------------------+
    
  • 内容与标准C库标题11相同,但有以下更改:
  • 函数calloc()malloc()realloc()不会通过调用::operator new() (18.6)来尝试分配存储空间。
  • 函数free()不会试图通过调用::operator delete()来释放存储空间。
  • 直接使用malloc()calloc()realloc()分配的存储在分配时隐式声明为可达(见3.7.4.3),在取消分配时不再声明为可达,并且不需要停止声明为可达的结果undeclare_reachable()调用。
  • 如您所见,C ++标准委托C标准定义malloc ,并且不会对其返回值或类型进一步限制。 由于C有NULL但不是nullptr ,所以我们可以放心地说malloc返回NULL

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


    std::malloc首先返回一个指针。 nullptr不是一个指针(这实际上就是它的全部要点)。 因此, std::malloc不能返回nullptr

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

    所以如果你测试nullptr的返回值,它会测试true,当且仅当std::malloc失败。

    整数字面量0中的宏NULL结果(对于C ++)(注意:它也可以导致nullptr ,但几乎没有实现这样做)。 按照C ++的规则,整数字面量0可隐式转换为空指针常量,并可与任何指针值相比较(如果指针值为“空指针常量”,则结果为等于)。

    所以,如果你测试返回值对NULL ,它会测试true,当且仅当std::malloc失败。


    都不是。

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

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

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

    链接地址: http://www.djcxy.com/p/28471.html

    上一篇: Does std::malloc return NULL or nullptr on failure

    下一篇: Why does C++ require a cast for malloc() but C doesn't?