Ответ
Управляемая память (Managed Memory) — память, жизненным циклом которой управляет среда исполнения (например, CLR в .NET через Garbage Collector). Разработчик не занимается её явным выделением и освобождением.
Неуправляемая память (Unmanaged Memory) — память, выделяемая и освобождаемая вручную разработчиком, обычно для взаимодействия с нативным кодом (библиотеками на C/C++) или в высокопроизводительных сценариях.
| Сравнение: | Аспект | Управляемая память | Неуправляемая память |
|---|---|---|---|
| Управление | Автоматическое (GC) | Ручное | |
| Безопасность | Высокая (минимум утечек) | Низкая (риск утечек, висячих указателей) | |
| Производительность | Накладные расходы на GC | Прямой доступ, меньше накладных расходов | |
| Использование | Объекты .NET, массивы | Нативные вызовы (P/Invoke), буферы для IO |
Пример работы с неуправляемой памятью в C#:
using System.Runtime.InteropServices;
// Выделение блока неуправляемой памяти
IntPtr unmanagedBuffer = Marshal.AllocHGlobal(1024); // 1 КБ
try
{
// Запись данных в неуправляемую память
byte[] data = Encoding.UTF8.GetBytes("Hello Unmanaged World");
Marshal.Copy(data, 0, unmanagedBuffer, data.Length);
// Чтение данных обратно (имитация передачи в нативную библиотеку)
byte[] receivedData = new byte[data.Length];
Marshal.Copy(unmanagedBuffer, receivedData, 0, receivedData.Length);
Console.WriteLine(Encoding.UTF8.GetString(receivedData));
}
finally
{
// КРИТИЧНО: Обязательное освобождение памяти
Marshal.FreeHGlobal(unmanagedBuffer);
}
Почему важно понимать разницу? Утечки неуправляемой памяти не отслеживаются GC и приводят к стабильному росту потребления памяти приложения (memory leak). Для работы с неуправляемыми ресурсами в .NET используют паттерн IDisposable и конструкцию using.