0

現在、特定のコア API のインターフェイスを構築しています。コアはネイティブ C で記述されており、C# を使用して HTTP 要求を適切なコア関数にリダイレクトする Web API をインターフェイスとして作成することにしました。ただし、http 要求を行うたびにメモリが増加し続けることがわかりました。その理由はわかりません。

私のシステムの仕組み:

次のように、httpリクエストを関数にマッピングするApiControllerがあります。

[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++ 関数を呼び出すために使用されるクラスです。load 関数は、次のコードにリダイレクトされます。

        [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# のガベージ コレクターも有効にならず、手動で開始しても何もクリーンアップされません。アンマネージ メモリを割り当てて解放しないようです。しかし、私がしているのは、与えられたコアの関数を使用することだけです。そして、そのコアを使用するソフトウェアはずっと前にリリースされており、その機能をスパムしてもメモリが増加しないため、コアにあった機能にはメモリリークがあってはなりません。私が考えることができるのは、アイドル状態になって閉じないスレッドだけです...わかりません。コア関数を調べたところ、引数として指定された名前をコピーする前に古い名前が解放されます(そして、私が理解できない他のロード処理を行います)。

4

0 に答える 0