5

有人愿意为那些对非托管代码和复杂的内存管理一无所知的人翻译这句话吗?

此缓冲区的存储空间是从大小为 64 KB 的进程的共享堆中分配的。缓冲区的最大大小将取决于堆使用情况。

它出现在几十个 MSDN 页面上,例如WriteConsole,但我找不到任何 API 可以计算这种数组在爆炸之前允许的最大大小,凭经验我可以告诉它在 61 到 62.5 KB 之间(通过调用 64 , 63, 62 等直到它停止设置DllImport) SetLastError。是否有类似GetTotalHeapSize的东西(如果它不是独立于 Windows 版本、平台架构、默认值等的 const 64KB)和类似的东西GetCurrentHeapInUse?如何获得我可以传递给该方法和其他 P/Invoked 方法的最大字节数?

4

1 回答 1

4

这不是堆的工作方式。他们不跟踪您可以进行的最大分配。这是不可预测的,因为堆可能会变得碎片化。空闲块可以与分配的块交错。例如,释放一个小的分配可能会突然使可用空间增加一倍。非托管堆没有托管堆的优势,它们不能被压缩。尽管 .NET 大对象堆也有这个问题。没有测量最大可用空间的功能,不可能使该线程安全。

如果你不能,你只能尝试分配和处理后果。

于 2013-04-15T23:48:48.367 回答