2015-07-04 46 views
10

In glibc, malloc is implemented with arenas。 因此,例如,線程A中由malloc和之後的free d首先分配的存儲器有可能不能由線程B中的另一個malloc調用使用,因爲線程A和B可能位於不同的場所中,並且不同的場合保持不同的堆和空閒的內存列表。在C++中,可以在一個線程中分配由另一個線程刪除的內存嗎?

當涉及到C++(也許C++ 11自C++ 11有一個新標準以來),故事仍然是一樣的嗎?

或者不同的線程實際上共享同一段堆和空閒內存列表,並且new在一個線程中可以先分配內存new ed和更高版本delete d由另一個線程?

如果答案是依賴於實現的,那麼問題是它們如何在主要的C++編譯器中實現,比如g ++,MVC++,icc?

編輯

我認爲這個問題是在這個意義上有效的,有時你推出許多 線程,每個線程,動態分配/解除分配的內存大塊的大量的對象,而你不希望應用程序的內存使用率高得離譜。

+1

C++沒有指定如何實現分配函數,只是他們必須產生什麼結果。 –

+0

在實踐中'new'調用'malloc'。但目前還不清楚你希望如何處理這些信息。 –

+0

你的意思是'new'是由'malloc'實現的嗎?這是標準化的嗎? – Allanqunzi

回答

2

此:

不同的線程實際上共享堆和內存空閒列表的同一網段,並在一個線程新的可分配內存第一newed,後來被另一個線程

刪除線程的目的 - 共享內存空間。如果你不需要這個功能,你最好使用過程。

+0

請注意,在C中,某些線程可用的可用內存空間可能無法被其他線程訪問。我在問C++中的行爲,我不是在談論像訪問跨越不同線程的變量。 – Allanqunzi

+0

@Allanqunzi - 如果是這樣的話,不要打擾線程,因爲它們相對於進程的主要優勢是更容易的內部通信。 –

0

這取決於。在Windows上,不允許使用DLL的線程將在一個DLL中分配的內存所有權轉移給另一個DLL。所有新聞和刪除必須在DLL的「同一側」執行。儘管這不是嚴格的線程問題,但它仍然暗示着線程不能簡單地將內存所有權轉移給任何其他線程而不知道內存的起源。

Do (statically linked) DLLs use a different heap than the main program?

+2

沒有「基於DLL的線程」這樣的事情。通過「new」在DLL中分配的內存不能通過「delete」在另一個DLL或主應用程序中解除分配 - 這與線程無關。 – immibis

+0

我改變了從「基於DLL的線程」到「使用DLL的線程」的措辭,因爲這就是我的意思。 –

+0

如果使用相同的編譯器和標誌編譯DLL,則釋放在另一個DLL中分配的內存時沒有問題。 –

1

C++性病您使用分配器執行是兩回事。如果您使用gcc來編譯你的C++代碼,它默認使用的glibc的分配器。所以如果你的gcc是一個足夠新的版本,它使用glibc和per-thread arenas,你很好去。

相關問題