![](/img/trans.png)
[英]Why does “weak.lock()” return “nullptr” with the definition of “auto weak=std::make_shared<int>(42);”?
[英]Does std::malloc return NULL or nullptr on failure
根據http://en.cppreference.com/w/cpp/memory/c/malloc std :: malloc在失敗時返回空ptr
是NULL指針還是nullptr?
如果為nullptr,則表明std :: malloc與C malloc之間存在差異。 在這種情況下,接下來的另一個問題是否還有其他區別?
編輯:這不是注釋中建議的重復項。 這就說明了nullptr是什么,很清楚地說它們是不同的。 問題不在於它們之間的區別。
都不是。
返回類型為std::malloc
為void*
。 分配失敗的返回值是類型為void*
的空指針值 。
NULL
是預處理器宏。 宏本身沒有類型或值。 該宏可以定義為nullptr
或0
。 所以我們真的不能說std::malloc
返回NULL
。 我們可以說它返回的值等於從NULL
解析的值可轉換的值。
盡管nullptr
是“空指針文字”,但它本身並不是指針。 它的類型不是傳統的指針類型。 奇怪的是,它的類型是decltype(nullptr)
,它不是std::malloc
的返回類型。 所以std::malloc
不返回nullptr
。
它返回NULL
。 根據C ++標准的N4296草案:
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 ++標准將malloc
的定義委托給C標准,並且對其返回值或類型沒有任何進一步的限制。 由於C具有NULL
但沒有nullptr
,因此我們可以肯定地說malloc
返回NULL
。
但是所有這些都是沒有意義的,因為NULL == nullptr
始終為true,因為它們都是“空指針常量”(在4.10指針轉換[conv.ptr]中明確定義的術語)。 兩者是等效的。
std::malloc
首先返回一個指針。 nullptr
不是指針 (實際上是指針的全部)。 因此, std::malloc
無法返回nullptr
。
失敗時, std::malloc
將返回一個指針值,該值被定義為“空指針常量”。 nullptr
是一種非指針類型,可以隱式轉換為“空指針常量”,並且可以與任何指針值進行相等比較(如果指針值為“空指針常量”,則返回等於)。
因此,如果您針對nullptr
測試返回值,則僅當std::malloc
失敗時,它將測試true。
宏NULL
結果( 對於C ++而言 )為整數常量0(注意:它也可以產生nullptr
,但幾乎沒有實現nullptr
)。 根據C ++的規則,整數文字0可以隱式轉換為null指針常量,並且可以與任何指針值進行比較(如果指針值為“ null指針常量”,則結果等於)。
因此,如果您針對NULL
測試返回值,則當且僅當std::malloc
失敗時,它將測試true。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.