2010-03-08 39 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函数将(大概)完全分开分配其内存,因此可能不会受垃圾回收器影响。

不知道你在说什么垃圾收集器,但可能无法确定地说。