2013-02-22 82 views
1

我不明白什麼標準需要做與調用運營商刪除void * == nullptr。運算符刪除標準行爲

事情是這樣的:

void foo(void* ptr) // ptr == nullptr here 
{ 
    delete ptr; 
} 

,一方面,我們在標準以下語句:

ISO/IEC 14882:2011

5.3.5刪除[EXPR .delete]

1 ...操作數應該有一個指向obj的指針ect類型或類型 具有單個非顯式轉換函數(12.3.2)到對象類型的指針 。結果類型void.78

78)這意味着一個對象不能使用 void *類型的指針,因爲空隙不是一個對象類型被刪除。

它使刪除void *格式不正確的代碼。在另一方面,我們在刪除有關nullptr另一份聲明:

ISO/IEC 14882:2011

5.3.5刪除[expr.delete]

2 ...在第一替代(刪除對象), 刪除操作數的值可以是空指針值,指向由前一個新表達式創建的非數組對象的指針,或指向 子對象( 1.8)表示一個基類這樣一個對象(條款 10)。如果不是,則行爲未定義。在第二個替代方案 (刪除陣列),中,刪除操作數的值可能爲空 指針值或由前一個數組產生的指針值 new-expression如果不是,則行爲未定義。

在這種情況下需要做什麼?

+0

矛盾在哪裏?你可以刪除'NULL'或非''void *'的東西。 – cnicutar 2013-02-22 04:06:50

+0

@cnicutar我爲我的問題添加了一個示例 – FrozenHeart 2013-02-22 04:10:13

+0

nullptr的類型不是void *,它是std :: nullptr_t,它可以隱式轉換爲任何指針類型。這遠不是'void *'。 – 2013-02-22 04:12:55

回答

3

空和void*是兩個不同的東西:

delete static_cast<int*>(nullptr); // deleting null pointer, of int* 

你定的代碼會形成不良的,但它沒有任何關係的指針(可能爲null)的,但其類型(不能是void*)。

+0

在我的問題中看到一個例子 – FrozenHeart 2013-02-22 04:11:05

+1

@NikitaTrophimov:見過。我看不出矛盾在哪裏。由於某種原因,這些是兩個單獨的子句,第一個明確地提到'void *',而第二個提到一般的'delete'。 – GManNickG 2013-02-22 04:13:09

+1

@NikitaTrophimov:'void *'是指針*類型*。 'NULL'是指針的*值*。它們是有區別的。簡而言之,只要指針不是* type *'void *',就允許有一個帶NULL值的指針。 – 2013-02-22 04:14:35