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 |
+----------------------------+
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::malloc
是void*
。 分配失败的返回值是void*
类型的空指针值 。
NULL
是预处理器宏。 宏本身没有类型或价值。 该宏可能被定义为nullptr
或0
。 所以我们不能说std::malloc
返回NULL
。 我们可以说它返回的值等于从NULL
解析的值中可转换的值。
尽管nullptr
是一个“空指针文字”,但它本身并不是一个指针。 它的类型不是传统的指针类型。 它的类型好奇地是decltype(nullptr)
,它不是std::malloc
的返回类型。 所以std::malloc
不会返回nullptr
。
上一篇: Does std::malloc return NULL or nullptr on failure
下一篇: Why does C++ require a cast for malloc() but C doesn't?