我不是计算机科学专业的人。托管资源分配在堆上。但我想知道非托管资源分配在哪里。如果非托管资源也分配在堆上,它是托管资源使用的同一个堆还是不同的堆?
提前致谢。
戒色
最佳答案
从操作系统的角度来看,堆本质上是一样的:分配给操作系统进程的内存空间。
不同之处在于,当 CLR(.net VM)在 Windows 进程中加载时,它会占用该堆的一部分并将其转变为托管堆。此内存空间成为分配所有托管资源并为垃圾收集器所知的地方。
例如,如果您分配了一大块非托管内存并用完了托管堆的空间,您可能会遇到内存不足错误。或者反过来。
Jeffrey Richter 是更好地解释这些东西的人。我强烈推荐阅读他的解释:
- Garbage Collection: Automatic Memory Management in the Microsoft .NET Framework
- Garbage Collection Part 2: Automatic Memory Management in the Microsoft .NET Framework
您可以使用 System.InteropServices 命名空间的服务,Marshal特别是类,用于在堆的非托管部分和托管部分之间复制数据。
关于c# - 分配非托管资源的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2855210/