我正在编写一个C#库,其中调用应用程序将传递大量连续的非托管内存。这个调用应用程序可以来自.Net或Visual C ++(如果是从C ++调用我的库,它将通过中间C ++ / CLI库)。验证有足够的内存是有用的,所以我决定调用_msize()函数。不幸的是,_msize似乎总是给我错误的尺寸。 我回去并在我的示例应用程序中修改了我的分配例程,然后立即调用_msize。这是我的代码snipet:
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认为分配的内存少于所要求的内存。任何人都有任何线索,为什么这是?关于我应该做什么的任何建议都会受到赞赏。
答案 0 :(得分:2)
P /调用LocalSize
函数。
_msize
用于确定使用malloc
(及其朋友)分配的块的大小。 AllocHGlobal
是GlobalAlloc
或LocalAlloc
的包装(取决于您相信的引用;但我认为这两个是等效的),并且您希望LocalSize
函数确定实际返回的块的大小。据我所知,Marshal
并不包含LocalSize
的包装器,但您可以使用P / Invoke调用它。
所以看起来只有纯粹的好运才能_msize
返回任何对你有用的东西。也许malloc
使用GlobalAlloc
(或LocalAlloc
),或者只是在被要求使用大块时使用_msize
,并请求一些额外的空间用于簿记;在这种情况下{{1}}会试图弥补这一点。