我正在编写一个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时,返回的memSize为199178885。我看到了类似的结果,对于不同的数字也是如此。它的偏差小于0.01%,如果超过了我完全可以理解,但事实是它低于要求的值,这意味着_msize认为分配的内存少于要求的。有人知道为什么吗?还有,任何关于我应该做些什么的建议也将不胜感激。
_msize
返回一个size_t
,它是无符号的(通常通过IntPtr
进行映射)。并不是说这是你的问题,但这是需要注意的。 - Ed S.