Как управляется память для объектов C #, когда код C используется как класс C #?

#c# #c #memory #memory-management #managed-c

#c# #c #память #управление памятью #управляемый-c

Вопрос:

Как управляется память для объектов C #, когда код C используется как класс C #?

ПРИМЕЧАНИЕ: Я не конкретен в этом вопросе, но просто интересуюсь, как это делается.

Ответ №1:

Это работает точно так же … объекты, недоступные управляемому коду, подлежат сборке мусора, поэтому, если ваш неуправляемый код полагается на управляемые ресурсы для продолжения существования, вы должны хранить ссылку на него где-нибудь на стороне c # приложения.

редактировать: это относится к неуправляемому c

Комментарии:

1. Предположим, у меня есть сценарий, в котором мой управляемый код c вызывает сервер класса C #, который возвращает массив или объект (т. Е. Я предполагаю, что память объекта будет выделена в управляемой куче). Теперь я сомневаюсь в том, как этот объект C # memroy используется кодом c

2. Как сказал Яур, таким же образом, как из класса C #. Код h C собирается обернуть их в управляемый указатель, о котором он сообщает GC. Эти указатели, пока они существуют, считаются ссылочными и останавливают сборку мусора. Когда-то для этого существовал шаблон GcRoot. В наши дни это более прозрачно, но подход тот же.

3. Я не думаю, что я когда-либо сталкивался со случаем, когда мне приходилось возвращать массив из c # в c . Вам пришлось бы либо распределить ее в неуправляемую память, либо закрепить массив, что означает, что вам придется проделать некоторую работу, чтобы избежать утечек памяти. c / cli (то, что вы называете managed-c ) немного более прямолинейен, потому что он обрабатывает большую часть этого маршалинга за кулисами IIRC из управляемого бита вашей сборки c / cli точно такой же, как если бы это был c #, а сложная часть находится между управляемым и неуправляемые части этой сборки.

4. Обратите внимание, что недостаточно просто «хранить ссылку». Должно быть гарантировано, что ссылка останется живой, даже если дрожание оптимизирует ее. Используйте метод KeepAlive , чтобы гарантировать, что объект, используемый в неуправляемом коде, остается живым.

Ответ №2:

Управляемый C использует обычный сборщик мусора.