#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 использует обычный сборщик мусора.