2010-03-08 42 views
3

想象一下,您使用GC從一種語言中反覆調用另一種語言的函數(例如,Fortran 95)。 Fortran函數會在調用程序之間留下一些內容,這些調用可能會從調用者語言中看到爲未引用的垃圾。垃圾收集器是否可以通過用其他語言編寫的函數留下「垃圾」?

來自調用者語言的GC是否可以訪問Fortran中分配的內存,並將其視爲垃圾並釋放它?

我想它不會發生。由Fortran函數分配的內存應該有自己的內存管理,與GC管理的內存分開,但是,如果有人能夠確認,我會很高興。

爲什麼我需要它? (如果有人感興趣)

如上所述,我需要在F95中編寫一個函數,它分配自己的內存,被多次調用,並且需要在調用之間保持對分配內存的引用。問題在於Fortran指針與外部世界不兼容,所以我不能僅僅通過Fortran中的'void *'來傳遞一些東西。因此,Fortran函數不會將指針存儲爲指針,而是會將其作爲外部世界的整數數組進行轉換(例如)。但是,如果GC無論如何都會干擾Fortran的內存,則可能不知道該引用保留在整數數組中,並且可能希望釋放Fortran中分配的內存,這很糟糕。

+0

使用非託管語言,無論更好還是更糟,關於內存(de)分配您都是您自己的。 – 2010-03-08 15:17:27

+0

問題是我不知道函數的用戶將使用什麼語言。因此我需要想出一個幾乎適用於任何事情的解決方案。 – Jan 2010-03-08 15:23:10

回答

4

不,除非語言與主機語言明確集成(使用垃圾回收器)。在.NET中......一個C++應用程序可以使用C++/CLI來分配.NET對象並返回這些對象 - 而這些自然會被垃圾收集。我在許多項目中都這樣做。

但是純粹的C++對象......垃圾colelctor一無所知,不知道如何處理。

0

這個問題可能沒有一個答案,保證是正確的。但是,通常情況下,垃圾收集器將與某種堆分配器關聯,並且只能收集其控制的堆中的內存。由於您的Fortran函數將(大概)完全分開分配其內存,因此可能不會受垃圾回收器影響。

不知道你在說什麼垃圾收集器,但可能無法確定地說。