我目前正在为给定的核心 API 构建接口。核心是用原生 C 编写的,我们决定创建一个 Web 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 是一个用于通过 P/Invoke 调用本机 c++ 函数的类加载函数被重定向到这段代码:
[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);
}
load 函数是用 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/something”时,内存不断增加。似乎旧的和无关的内存不会被释放。C# 中的垃圾收集器也不会激活,如果我手动启动它,什么都不会被清理。好像我分配了非托管内存并且不释放它。但我所做的只是使用给我的核心功能。并且核心中的功能不应该有任何内存泄漏,因为使用该核心的软件很久以前就发布了并且向该功能发送垃圾邮件不会使内存增加。我能想到的只是空闲且不关闭的线程......我不知道。我查看了核心函数,它在复制作为参数给出的名称之前释放了旧名称(它还做了一些我不明白的其他加载内容),