В чём разница между управляемой и неуправляемой памятью?

«В чём разница между управляемой и неуправляемой памятью?» — вопрос из категории Управление памятью, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Управляемая память (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.