Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Talien
4 / 4 / 1
Регистрация: 25.01.2011
Сообщений: 32
1

После окончания работы со структурой, она будет почищена сборщиком. Что произойдет со структурой в неуправляемой памяти

24.01.2012, 07:13. Просмотров 905. Ответов 5
Метки нет (Все метки)

Доброго времени суток.

Прочитал закрепленный топик "Класс Marshal, использование PInvoke, небезопасный код (unsafe)". Возник вопрос, на который не смог сам найти ответ.
Допустим, есть у меня функция, написанная на с++, возвращающая ссылку на структуру. Я из c# вытаскиваю эту структуру в некую переменную.
C#
1
2
public static extern IntPtr somefunc();
SOMESTRUCT somestruct = (SOMESTRUCT)Marshal.PtrToStructure(somefunc,sizeof(SOMESTRUCT));
После окончания работы со структурой, она будет почищена сборщиком. А что произойдет со структурой в неуправляемой памяти?

И вопрос 2.
Допустим мой код с++ выделяет память c помощью malloc и возвращает ссылку на нее. Код на c# получает эту ссылку. Как ему освободить эту память, после работы с ней?
Поможет ли Marshal.FreeHGlobal() ?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2012, 07:13
Ответы с готовыми решениями:

Что будет выведено после окончания работы программы?
О: пределите, что будет выведено после окончания работы программы: Program a1; var a, b, x, y:...

Что будет если я не создам файлы sitemap и robots для сайта с простой структурой?
Просто праздный интересе. Сам сайт: tetradka33.ru!

Освобождение памяти со структурой
Всем привет. Есть структура: struct ClientInfo { const char* szUid; const char*...

можете привести пример программы со структурой данных, и объяснить как она работает
можете привести пример программы со структурой данных, и объяснить как она работает. Добавлено...

Доделать программу работы со структурой школа
Задание: Дана информация о пяти школах. Запись имеет вид: номер школы, год, количество выпускников,...

5
kolorotur
Эксперт .NET
12303 / 9794 / 2511
Регистрация: 17.09.2011
Сообщений: 16,654
Завершенные тесты: 1
24.01.2012, 11:04 2
Цитата Сообщение от Talien Посмотреть сообщение
После окончания работы со структурой, она будет почищена сборщиком.
Только если структура является переменной класса. Если это переменная метода, то сборщик ее не трогает.

Цитата Сообщение от Talien Посмотреть сообщение
что произойдет со структурой в неуправляемой памяти?
Ну так как память неуправляемая, само собой разумеется что никто ее не подчистит
Так и будет там висеть до завершения работы приложения.

Цитата Сообщение от Talien Посмотреть сообщение
Поможет ли Marshal.FreeHGlobal() ?
Поможет, если функция из нативной библиотеки возвращает указатель на созданную структуру, который в управляемом коде маршаллится как IntPtr.
В противном случае (а вообще - в идеале) нативная библиотека должна предоставлять функцию для освобождения выделенной памяти.
0
Talien
4 / 4 / 1
Регистрация: 25.01.2011
Сообщений: 32
24.01.2012, 11:24  [ТС] 3
Цитата Сообщение от kolorotur Посмотреть сообщение
Только если структура является переменной класса. Если это переменная метода, то сборщик ее не трогает.
После окончания работы метода, память все равно будет освобождена, при условии что структура не использует неуправляемые ресурсы.

Цитата Сообщение от kolorotur Посмотреть сообщение
Ну так как память неуправляемая, само собой разумеется что никто ее не подчистит
Так и будет там висеть до завершения работы приложения.
Хм, я всегда думал, что если мы не освободим занятую память, то она так и останется висеть занятой, даже после закрытия приложения. Я не прав?

Т.е. если я получаю из неуправляемой библиотеки ссылку на структуру, то я должен после работы с ней явно освободить память, используя Marshal.FreeHGlobal()?
0
kolorotur
Эксперт .NET
12303 / 9794 / 2511
Регистрация: 17.09.2011
Сообщений: 16,654
Завершенные тесты: 1
24.01.2012, 11:35 4
Цитата Сообщение от Talien Посмотреть сообщение
После окончания работы метода, память все равно будет освобождена, при условии что структура не использует неуправляемые ресурсы.
Я о том же.

Цитата Сообщение от Talien Посмотреть сообщение
я всегда думал, что если мы не освободим занятую память, то она так и останется висеть занятой, даже после закрытия приложения. Я не прав?
Нет, не правы. Запрошенная память числится за вашим приложением. Если оно запрошенную память не возвращает - значит ему так надо, ОС в его дела не вмешивается (пока не приходится кешировать). После завершения работы приложения его домен уничтожается, вследствие чего вся память, когда-либо запрошенная этим процессом, автоматом помечается свободной.

Цитата Сообщение от Talien Посмотреть сообщение
Т.е. если я получаю из неуправляемой библиотеки ссылку на структуру, то я должен после работы с ней явно освободить память, используя Marshal.FreeHGlobal()?
Так точно. Все это дело можно обернуть в класс, реализующий IDisposable, в котором выполнять все эти манипуляции, чтобы не засорять основной код "мелкоуровневой" суетой.
Ну и потестить, конечно. В этом деле очень хорошо помогает ANTS Memory Profiler, но он платный, зараза (14 дней на ознакомительной версии с полным функционалом).
1
Talien
4 / 4 / 1
Регистрация: 25.01.2011
Сообщений: 32
24.01.2012, 11:47  [ТС] 5
Спасибо за ответы.
0
NickoTin
Почетный модератор
Эксперт .NET
8648 / 3600 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
24.01.2012, 12:31 6
Цитата Сообщение от Talien Посмотреть сообщение
Допустим мой код с++ выделяет память c помощью malloc и возвращает ссылку на нее. Код на c# получает эту ссылку. Как ему освободить эту память, после работы с ней?
Поможет ли Marshal.FreeHGlobal() ?
Не поможет, память выделенная через malloc должна освобождаться с помощью функции free.
Чтобы можно было использовать Marshal.FreeHGlobal память должна быть выделена функцией LocalAlloc или GlobalAlloc (не рекомендуется, но можно).
0
24.01.2012, 12:31
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2012, 12:31

Структура tree. Функция работы с этой структурой
Привет. В книге (неважно какой), есть пример такого кода: struct tree { int v; tree* p; }; ...

Описать класс для работы с древовидной структурой
Задание заключается в следующем: создать класс объекта, являющегося узлом дерева. Реализовать...

Программа для работы со структурой Успеваемость студентов
1. Необходимо каждый пункт задания оформить в виде функции. Все необходимые данные для функций...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.