3

呼び出し元のアプリが大量の連続した管理されていないメモリを渡すC#ライブラリを作成しています。この呼び出し元のアプリは、.NetまたはVisual C ++のいずれかから取得できます(C ++からの場合は、ライブラリを呼び出す前に中間のC ++ / CLIライブラリを通過します)。十分なメモリがあることを検証すると便利なので、_msize()関数を呼び出すことにしました。残念ながら、_msizeは常に間違ったサイズを返すようです。サンプルアプリに戻って割り当てルーチンを変更し、すぐに_msizeを呼び出しました。これが私のコードスニペットです:

public unsafe class MyMemory
{
    /// <returns></returns>
    [DllImport("msvcrt.dll", SetLastError = true)]
    public static extern int _msize(IntPtr handle);

    public static IntPtr MyAlloc(int size)
    {
        IntPtr retVal = Marshal.AllocHGlobal(size);

        ...

        int memSize = MyMemory._msize(retVal);
        if (memSize < size)
        {
        ...
        }
        return retVal;
    }

サイズ199229440を渡すと、199178885のmemSizeが返されます。さまざまな数値で同様の結果が得られました。0.01%未満のオフであり、それが終わっていれば完全に理解できますが、実際にはそれは下にあります。つまり、_msizeは、割り当てられたメモリが要求されたものよりも少ないと考えています。なぜこれなのか、誰か手がかりがありますか?そして、代わりに私が何をすべきかについてのアドバイスもいただければ幸いです。

4

1 に答える 1

2

P/LocalSize代わりに関数を呼び出します。

_msizemalloc(およびその友人)に割り当てられたブロックのサイズを決定するためのものです。またはAllocHGlobalのラッパーであり(どの参照を信じているかによって異なりますが、2つは同等だと思います)、実際に返されたブロックのサイズを関数で判別する必要があります。私の知る限り、のラッパーは含まれていませんが、P/Invokeを使用して呼び出すことができます。GlobalAllocLocalAllocLocalSizeMarshalLocalSize

_msizeですから、あなたにとって有用なものを何でも返すのは、幸運によってのみであるように思われます。おそらく、常にまたは大きなブロックを要求されたときに(または)mallocを使用し、簿記のために少し余分なスペースを要求します。その場合、それを補おうとします。GlobalAllocLocalAlloc_msize

于 2012-06-05T22:12:52.700 に答える