2012-06-05 67 views
3

我正在写一个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认为分配的内存小于所要求的内存。任何人都有任何线索,为什么这是?任何建议,我应该做的,而不会感激,以及。

+0

'_msize'返回一个size_t,它是无符号的(它通常通过'IntPtr'映射)。不要声称这是你的问题,但它是要注意的事情。 –

+0

Windows程序中有多个堆。 AllocHGlobal从*不同的堆中分配。 _msize只能给出由malloc()分配的内存的准确信息。您可以通过pinvoking LocalSize(不是GlobalSize,因为名称会显示)来获得您想要的内容。忘记分配的大小是相当奇怪的,一定要*不*认为IntPtr来自右堆。 –

回答

2

P /调用LocalSize函数。

_msize用于确定分配给malloc(及其朋友)的块的大小。 AllocHGlobalGlobalAllocLocalAlloc(取决于您相信的参考;但我认为这两个参数是相同的),并且您希望LocalSize函数可以确定实际返回的块的大小。据我所知,Marshal不包含LocalSize的包装,但可以使用P/Invoke调用它。

因此,看起来只有纯粹的好运气,_msize才会返回任何有用的东西。也许malloc使用GlobalAlloc(或LocalAlloc),无论是总是或只是当被要求大块,并要求一点额外的簿记空间;在这种情况下_msize会试图弥补这一点。

+0

LocalSize给出正确的答案。感谢您的解释。仍然很好奇_msize为什么接近我,我能够得到多种不同尺寸的类似结果... – Beast