簡體   English   中英

std :: malloc在失敗時是否返回NULL或nullptr

[英]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::mallocvoid* 分配失敗的返回值是類型為void*的空指針值

NULL是預處理器宏。 宏本身沒有類型或值。 該宏可以定義為nullptr0 所以我們真的不能說std::malloc返回NULL 我們可以說它返回的值等於從NULL解析的值可轉換的值。

盡管nullptr是“空指針文字”,但它本身並不是指針。 它的類型不是傳統的指針類型。 奇怪的是,它的類型是decltype(nullptr) ,它不是std::malloc的返回類型。 所以std::malloc不返回nullptr

它返回NULL 根據C ++標准的N4296草案:

20.7.13 C庫[c.malloc]

  1. 表45描述了標頭<cstdlib>

    表45 —標頭<cstdlib>提要:

     +------------+---------------+ | Type | Name(s) | +------------+---------------+ | Functions: calloc malloc | | free realloc | +----------------------------+ 
  2. 內容與標准C庫標頭11相同,但有以下更改:
  3. 函數calloc()malloc()realloc()不會通過調用::operator new() (18.6)來嘗試分配存儲。
  4. 函數free()不會通過調用::operator delete()來嘗試取消分配存儲。
  5. 通過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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM