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

LocalSize改为P/Invoke函数。

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

因此,似乎只有纯粹的好运才能_msize返回对您有用的任何东西。也许总是或仅在要求大块时malloc使用GlobalAlloc(或),并请求一些额外的簿记空间;LocalAlloc在这种情况下_msize将试图弥补这一点。

于 2012-06-05T22:12:52.700 回答