4 / 4 / 1
Регистрация: 25.01.2011
Сообщений: 32
|
||||||
1 | ||||||
После окончания работы со структурой, она будет почищена сборщиком. Что произойдет со структурой в неуправляемой памяти24.01.2012, 07:13. Показов 1453. Ответов 5
Метки нет (Все метки)
Доброго времени суток.
Прочитал закрепленный топик "Класс Marshal, использование PInvoke, небезопасный код (unsafe)". Возник вопрос, на который не смог сам найти ответ. Допустим, есть у меня функция, написанная на с++, возвращающая ссылку на структуру. Я из c# вытаскиваю эту структуру в некую переменную.
И вопрос 2. Допустим мой код с++ выделяет память c помощью malloc и возвращает ссылку на нее. Код на c# получает эту ссылку. Как ему освободить эту память, после работы с ней? Поможет ли Marshal.FreeHGlobal() ?
0
|
24.01.2012, 07:13 | |
Ответы с готовыми решениями:
5
Что будет выведено после окончания работы программы? Что будет если я не создам файлы sitemap и robots для сайта с простой структурой? Освобождение памяти со структурой можете привести пример программы со структурой данных, и объяснить как она работает |
17769 / 12922 / 3378
Регистрация: 17.09.2011
Сообщений: 21,194
|
|
24.01.2012, 11:04 | 2 |
Только если структура является переменной класса. Если это переменная метода, то сборщик ее не трогает.
Ну так как память неуправляемая, само собой разумеется что никто ее не подчистит Так и будет там висеть до завершения работы приложения. Поможет, если функция из нативной библиотеки возвращает указатель на созданную структуру, который в управляемом коде маршаллится как IntPtr. В противном случае (а вообще - в идеале) нативная библиотека должна предоставлять функцию для освобождения выделенной памяти.
0
|
4 / 4 / 1
Регистрация: 25.01.2011
Сообщений: 32
|
|
24.01.2012, 11:24 [ТС] | 3 |
После окончания работы метода, память все равно будет освобождена, при условии что структура не использует неуправляемые ресурсы.
Хм, я всегда думал, что если мы не освободим занятую память, то она так и останется висеть занятой, даже после закрытия приложения. Я не прав? Т.е. если я получаю из неуправляемой библиотеки ссылку на структуру, то я должен после работы с ней явно освободить память, используя Marshal.FreeHGlobal()?
0
|
17769 / 12922 / 3378
Регистрация: 17.09.2011
Сообщений: 21,194
|
|
24.01.2012, 11:35 | 4 |
Я о том же.
Нет, не правы. Запрошенная память числится за вашим приложением. Если оно запрошенную память не возвращает - значит ему так надо, ОС в его дела не вмешивается (пока не приходится кешировать). После завершения работы приложения его домен уничтожается, вследствие чего вся память, когда-либо запрошенная этим процессом, автоматом помечается свободной. Так точно. Все это дело можно обернуть в класс, реализующий IDisposable, в котором выполнять все эти манипуляции, чтобы не засорять основной код "мелкоуровневой" суетой. Ну и потестить, конечно. В этом деле очень хорошо помогает ANTS Memory Profiler, но он платный, зараза (14 дней на ознакомительной версии с полным функционалом).
1
|
4 / 4 / 1
Регистрация: 25.01.2011
Сообщений: 32
|
|
24.01.2012, 11:47 [ТС] | 5 |
Спасибо за ответы.
0
|
Почетный модератор
|
|
24.01.2012, 12:31 | 6 |
Не поможет, память выделенная через malloc должна освобождаться с помощью функции free.
Чтобы можно было использовать Marshal.FreeHGlobal память должна быть выделена функцией LocalAlloc или GlobalAlloc (не рекомендуется, но можно).
0
|
24.01.2012, 12:31 | |
24.01.2012, 12:31 | |
Помогаю со студенческими работами здесь
6
Доделать программу работы со структурой школа Структура tree. Функция работы с этой структурой Описать класс для работы с древовидной структурой Программа для работы со структурой Успеваемость студентов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |