2013-10-03 50 views
4

malloc/free和new/delete here有一個很好的比較,以及malloc()和free()如何工作here的很好的解釋。顯然,我們不能混用它們 - 使用new或free來使用malloc。C++中的malloc/free和new/delete兼容性?

在尊重上述「不混合」規則的同時,我們可以看到許多開源項目,與許多貢獻者一起使用這兩種機制。 Usualy,你在一個文件中只有一種方法(一個作者,一個偏好)。我已經分叉了這樣一個項目,並且使用新的/刪除來添加一些功能。但是我遇到了一些好奇的記憶腐敗。當然,我大概是負責人,但.....

這使我問一些「幼稚」的問題:

  1. 我可以有兩種機制的malloc /免費新/刪除在同一個編譯單元(* .o) - 當然,尊重「不混合」規則?

  2. 我可以交錯兩個機制,就像在這個代碼中一樣嗎?

    int *a = (int *) malloc (1000 * sizeof int); 
    
    int *b = new int[1000]; 
    
    // some code 
    
    free a; 
    
    delete[] b; 
    
+1

是的,但你甚至不應該在你自己的代碼中使用'new'或'malloc';而不是像'unique_ptr'或'shared_ptr'那樣使用智能指針。 – Simple

+0

我認爲這是合法的。 –

+0

你確定不要爲具有構造函數或析構函數的類型調用malloc()和free()嗎?這些調用不會執行您的類的構造函數和析構函數,因此可能會造成問題。 – Julien

回答

6

是的,你可以交錯他們 - 只使用一個釋放函數匹配用於分配的一個。只有使用錯誤的釋放函數時纔會出現此問題。

請注意,當您有多個庫時,這可能並不那麼容易 - 這些庫可能會使用不同的堆,因此即使使用了正確的命名函數,它也可能碰巧在錯誤的模塊中實現,因此請使用錯誤的堆你正確地進入未定義的行爲。請參閱this answer以更好地瞭解我在這裏討論的內容。

+0

請記住'malloc'只能用於POD數據類型,因爲它不運行構造函數。 – Angew

+1

@Angew你仍然可以使用'malloc',你只需要使用placement'new'並且自己調用析構函數。 'T * p = :: new(std :: malloc(sizeof(T)))T(some,args); P->〜T(); std :: free(p);' – Simple

+0

@簡單嗯,是的。但那麼問題是爲什麼。 – Angew