我正在写一个C#库,其中调用应用程序将传递大量的连续,非托管内存。这个调用应用程序可以来自.Net或Visual C++(如果从C++调用我的库,它将通过中间的C++/CLI库)。验证有足够的内存是有用的,所以我决定调用_msize()函数。不幸的是,_msize似乎总是给我错误的大小。 我回去修改我的示例应用程序中的分配例程,然后立即调用_msize。这里是我的一小段代码片段:通过从C#调用_msize()通过PInvoke#
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认为分配的内存小于所要求的内存。任何人都有任何线索,为什么这是?任何建议,我应该做的,而不会感激,以及。
'_msize'返回一个size_t,它是无符号的(它通常通过'IntPtr'映射)。不要声称这是你的问题,但它是要注意的事情。 –
Windows程序中有多个堆。 AllocHGlobal从*不同的堆中分配。 _msize只能给出由malloc()分配的内存的准确信息。您可以通过pinvoking LocalSize(不是GlobalSize,因为名称会显示)来获得您想要的内容。忘记分配的大小是相当奇怪的,一定要*不*认为IntPtr来自右堆。 –