В настоящее время я создаю интерфейс для данного основного API. Ядро пишет на нативном C, и мы решили создать веб-API в качестве интерфейса, используя C# для перенаправления http-запросов в нужную функцию ядра. Тем не менее, я обнаружил, что память увеличивается каждый раз, когда я делаю запрос http, и я не знаю, почему это так.
Как работает моя система:
У меня есть ApiController, отображающий запросы http на функции, например:
[ApiController]
public class MethodController : ControllerBase
{
public MethodController()
{
}
[HttpGet("load/{name}")]
public bool load(string name)
{
EngineMethods.Marshaller_EngineMethod_Load(name, out bool result);
return result;
}
EngineMethods - это класс, используемый для вызова встроенной функции c ++ через P / Invoke. Функция загрузки перенаправляется на этот фрагмент кода:
[DllImport(DllFilePath, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.I1)]
private extern static void load(string name, out bool ret);
public static void Marshaller_EngineMethod_Load(string name, out bool ret)
{
load(name, out ret);
}
функция загрузки пишет на C ++. Теперь я должен использовать предоставленный мне основной API (функции уже реализованы). Поскольку ядро не является потокобезопасным, я должен использовать этот Mutex для всех операций:
//it takes a lambda expression as an argument and can return any specified type
template<typename ReturnType, typename FunctionType>
ReturnType EngineMutex(FunctionType lambda)
{
__try
{
enterCriticalSection_engine();
return lambda();
}
__finally
{
leaveCriticalSection_engine();
}
}
Создание функции «загрузки» следующим образом:
void load(TCHAR *name, bool *ret)
{
*ret = false;
return EngineMutex<void>([&]
{
Core_load(name, ret);
});
}
Теперь моя проблема в том, что память продолжает расти, когда я спам "localhost: xxx / load / что-то". Кажется, что старая и неактуальная память не будет освобождена. Сборщик мусора из C# также не активируется, и если я запустил его вручную, ничего не очистится. Кажется, что я выделяю неуправляемую память и не освобождаю ее. Но все, что я делаю, - это использую функцию в ядре, которую мне дали. И функция, которая была в ядре, не должна иметь утечек памяти, потому что Программное обеспечение, использующее это ядро, долгое время выпускало go, а спам этой функции не приводит к увеличению памяти go. Все, о чем я могу думать, это темы, которые go простаивают и не закрываются ... Я не знаю. Я посмотрел на функцию ядра, и она освобождает старое имя перед тем, как скопировать имя, которое ему было дано в качестве аргумента (и он выполняет некоторые другие вещи, которые я не понимаю), но, как я уже сказал, то, что делает функция ядра, не должно иметь значения и не причина проблемы, а мои многочисленные шаги по перенаправлению запроса?