2013-09-25 26 views
6

請注意這個問題不是關於C的mallocmalloc vs new/C++中的智能指針。我應該如何在C++中投射malloc的結果?

如果我在C++中使用malloc,應該使用什麼類型的轉換?以下全部工作。

int *a = (int *)malloc(sizeof (int)); 
int *b = static_cast<int *>(malloc(sizeof (int))); 
int *c = reinterpret_cast<int *>(malloc(sizeof (int))); 

活生生的例子: http://ideone.com/lzfxcm

我更喜歡使用C++風格轉換在我的代碼儘可能地和我要採取安全的編碼習慣。請記住這個建議。

謝謝。

+0

的malloc的,一個C風格的類型轉換並不比reintprerpt_cast更不安全。 – tenfour

+4

是安全的,你應該使用新的而不是malloc –

+1

@claptrap我明確指出這個問題不是關於malloc vs new。有時malloc在C++中使用。它發生了。 –

回答

14

由於malloc返回一個指向void的指針,所以沒有理由在指針上使用C++風格的類型轉換:你得到一塊原始內存,沒有結構,所以你唯一可以告訴編譯器的是通過添加一個轉換就是你打算使用這個內存來處理特定類型的數據。編譯器必須同意你的看法,因爲它沒有額外的信息來仔細檢查你的決定。 static_cast<T>reinterpret_cast<T>都不提供超過C風格演員的特別優勢,並且C風格演員陣容更短。從個人的角度來看,我查看了很多C++代碼,但是我從來沒有見過與C++風格的C++風格類型一起使用,只使用了C風格。

+1

畢竟'malloc'是C! C++有'new'。 –

6

我傾向於使用static_cast,因爲您正在做的是將void*轉換爲指向某種其他對象類型的指針,該對象類型在C++中定義良好。

不應該在C++中使用C風格轉換,因爲編譯器不會執行任何類型檢查 - 通過使用C風格轉換,您將失去所有類型的安全性。這個想法是限制你的演員只有需要和沒有更多。

reinterpret_cast有一個不同的目的 - 重新解釋一些其他類型的對象的位。 void不是一個對象,所以這顯然不適用於void*/malloc

+0

(+1)我即將發佈類似的答案:-)這是一個[相關鏈接](http://stackoverflow.com/a/7970036/2633423)在SO上。 –

+1

'不應該在C++中使用C風格的演員'應該有比這更好的理由,或者沒有? – dmitri

+1

@dmitri:我已經更新了我的答案。另外,我是一名C++純粹主義者。 –

2

堅持原則總是使用「最不暴力」的演員陣容,我會推薦static_cast

然而,更妙的是像

template <typename T> 
T* mnew(std::size_t count = 1) 
{ 
    return static_cast<T*>(malloc(sizeof(T) * count)); 
} 
+0

你爲什麼要使用這個函數,而不僅僅是'operator new'? – tenfour

+4

因爲(1)返回'NULL'而不是調用new-handler和/或在發生錯誤時拋出'std :: bad_alloc',(2)返回的指針必須用'free()'而不是'刪除[]'或'刪除'和(3)它不會調用任何構造函數。 – Oberon

0

malloc的包裝函數返回void *指針,你可以用C風格的轉換將其轉換爲任何所需的指針,但C++引入了4個新的類型轉換操作符來克服一個缺點與C風格的演員相關聯,也就是說,他們不能使用IDE或任何其他工具(如grep)輕鬆檢測到。

求索你的榜樣

int *a = (int *)malloc(sizeof (int)); 
int *b = static_cast<int *>(malloc(sizeof (int))); 
int *c = reinterpret_cast<int *>(malloc(sizeof (int))); 

在這裏您可以輕鬆地搜索的static_cast或reinterpret_cast的所有實例,但它當時空調風格鑄那麼你有沒有其他辦法,只能簡單地看或挖成代碼,花無眠夜。相信我鑄造錯誤非常困難,它們破壞了C和C++風格語言提供的強大打字保證。但他們是一些真正的情況下需要這樣的演員。

因此,C++允許C風格的鑄造,但它的intodece reinterpret_cast運算符只做C風格的鑄造操作。

http://www.stroustrup.com/bs_faq2.html#void-ptr