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

时间:2017-10-04 03:21:35

标签: c++ malloc

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

  

20.7.13 C库[c.malloc]

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

         

    表45 - 标题<cstdlib>概要:

    +------------+---------------+
    | Type       | Name(s)       |
    +------------+---------------+
    | Functions:   calloc malloc |
    |              free realloc  |
    +----------------------------+
    
  2.   
  3. 内容与标准C库标题11相同,但有以下更改:
  4.   
  5. 函数calloc()malloc()realloc()不会通过调用::operator new()(18.6)来尝试分配存储空间。
  6.   
  7. 函数free()不会尝试通过调用::operator delete()来取消分配存储空间。
  8.   
  9. 直接分配给malloc()calloc()realloc()的存储在分配时被隐式声明可访问(参见3.7.4.3),在解除分配时不再被声明可达,并且不需要停止作为undeclare_reachable()电话的结果宣布可以到达。
  10.   

正如您所看到的,C ++标准委托C标准定义malloc,并且不对其返回值或类型进行进一步限制。由于C有NULL但不是nullptr,我们可以放心地说malloc会返回NULL

但是所有这一切都没有实际意义,因为NULL == nullptr总是如此,因为它们都是&#34;空指针常量&#34; (在4.10指针转换[conv.ptr]中明确定义的术语)。这两者是等价的。

答案 1 :(得分:1)

std::malloc首先返回一个指针。 nullptr 不是指针(实际上就是它的全部内容)。因此,std::malloc无法返回nullptr

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

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

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

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

答案 2 :(得分:1)

都不是。

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

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

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