根据http://en.cppreference.com/w/cpp/memory/c/malloc std :: malloc在失败时返回null ptr
这是一个NULL指针还是一个nullptr?
如果它是nullptr,那意味着std :: malloc和C malloc之间存在差异。那么接下来的另一个问题是,还有其他任何不同之处吗?
编辑: 这不是评论中建议的重复。这解释了什么是nullptr,显然它们是不同的。问题不在于询问它们之间的区别。
答案 0 :(得分:1)
返回NULL
。来自N4296 C ++标准草案:
20.7.13 C库[c.malloc]
表45描述了标题
<cstdlib>
。表45 - 标题
<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
总是如此,因为它们都是&#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::malloc
为void*
。分配失败的返回值是类型为void*
的空指针值。
NULL
是一个预处理器宏。宏本身没有类型或值。该宏可以定义为nullptr
或0
。所以我们不能说std::malloc
返回NULL
。我们可以说它返回的东西等于从NULL
解析的值中可转换的值。
虽然nullptr
是“空指针文字”,但它本身不是指针。它的类型不是传统的指针类型。奇怪的是,它的类型是decltype(nullptr)
,它不是std::malloc
的返回类型。因此std::malloc
不会返回nullptr
。