Может ли сборщик мусора достичь «мусора», оставленного функцией, написанной на другом языке? - PullRequest
3 голосов
/ 08 марта 2010

Представьте, что вы вызываете из языка с помощью GC функцию из другого языка (например, Fortran 95). Функция Fortran оставляет что-то распределенное в памяти между вызовами, что на языке вызывающего абонента может рассматриваться как несвязанный мусор.

Может ли GC из языка вызывающей стороны получить доступ к памяти, выделенной в Fortran, и считать ее мусором и освободить ее?

Я думаю, что этого не произойдет . Память, выделенная функцией Fortran, должна иметь собственное управление памятью, отделенное от памяти, управляемой GC, однако я был бы рад, если бы кто-нибудь смог это подтвердить.

Зачем мне это нужно? (если кому-то интересно)

Как описано выше, мне нужно написать функцию в F95, которая выделяет свою собственную память, вызывается несколько раз, и она должна сохранять ссылку на выделенную память между вызовами. Проблема в том, что указатели на Фортране несовместимы с внешним миром, поэтому я не могу просто передать что-то как 'пустое *' из Фортрана. Поэтому функция Fortran будет хранить указатель не как указатель, а будет приводить его (например) как целочисленный массив для внешнего мира. Однако, если GC каким-либо образом может помешать памяти из Fortran, он может не понимать, что ссылка хранится в целочисленном массиве, и может захотеть освободить память, выделенную в Fortran, что было бы плохо.

Ответы [ 2 ]

4 голосов
/ 08 марта 2010

Нет, если язык явно не интегрирован с языком хоста (используется сборщик мусора). В ... Я делаю это в ряде проектов.

Но чистый объект C ++ ... сборщик мусора ничего не знает и не умеет обращаться с ним.

0 голосов
/ 08 марта 2010

Вероятно, нет единого ответа на этот вопрос, который гарантированно будет правильным. Однако, как правило, сборщик мусора будет связан с каким-либо распределителем кучи и может / будет собирать память только в той куче, которой он управляет. Поскольку ваша функция на Фортране (предположительно) будет выделять свою память совершенно отдельно, сборщик мусора, вероятно, не будет на нее воздействовать.

Не зная точно, о каком сборщике мусора вы говорите, вероятно, невозможно сказать с уверенностью.

...