2013-04-11 58 views
0

我正在創建一個結構體,該結構體的堆上有一個unordered_map字段。當我使用新的,我可以添加到它沒有問題。但是使用calloc時,由於存儲區大小爲0,所以我插入了一個錯誤。在我調用reserve後,它正常工作。calloc(),malloc()vs新建一個內部具有unordered_map的結構體

因此,當在結構上調用calloc時,unordered_map構造函數是否不運行?我很困惑,爲什麼如果它是在一個新的結構,它似乎有一個非零的桶大小。除了撥打儲備金之外,還有更好的方法可以解決嗎? (我不能在這種情況下使用刪除,所以我需要堅持使用calloc呼叫)

+0

爲什麼你不得不使用calloc? – Pubby 2013-04-11 07:46:41

+0

這是傳統代碼。我只是添加一個新的領域,它恰好是一個無序的地圖。 – jamesatha 2013-04-11 07:47:31

+0

夠公平的。我想這意味着你不能使用新的位置? – Pubby 2013-04-11 07:49:20

回答

5

你是對的,malloc()等人不運行構造函數,而new呢。

您不能依賴在calloc()似乎解決問題後撥打reserve()的事實。它沒有。你的代碼的行爲仍然是undefined,它可以隨時以任何方式炸燬它。

解決此問題的一種方法是使用placement new調用unordered_map的構造函數。

或者,您可以將該字段變爲指針calloc()struct,然後使用new分配和構造unordered_map。如果你這樣做,你將不得不手動delete它。

1

C內存分配函數通常不會調用構造函數。請參閱malloc vs new。第一個答案總結得非常好:不要在C++中使用malloc

+0

通常?他們將永遠不會調用構造函數。 (好吧,'char'可能是唯一的例外) – Pubby 2013-04-11 07:48:35

+0

由於我不可能知道每個實現的行爲,所以我堅持通常。 – 2013-04-11 07:50:12

0

calloc沒有做任何事情來初始化你的對象作爲對象。它基本上給你一個指向一些填滿零的內存的指針。因此,任何需要初始化的內部字段(如您的地圖)都不會得到它。 您不應該將calloc與對象一起使用。(確實,你可能根本不需要它。)