".NET中的“new”关键字实际上是做什么用的?"

10
我知道new关键字调用类的构造函数,但我们在哪个阶段分配类的内存呢?
在我看来,它应该对应于GCHandle.Alloc(Object)方法,但我找不到联系。

2
但是我们在哪个阶段为类分配内存呢?你并不需要操作,运行时会自动进行。你想要做什么以及为什么想知道这个信息? - CodeCaster
1
实际上这只是一个理论问题。我只是想了解 .net 如何与内存交互工作。 - Sergey Kravchenko
3
所有的内存管理都由CLR完成,如这里所解释的。如果你想了解.NET如何处理内存(de)allocation的基础知识,请查看垃圾回收器页面。如果你想学习一般的内存管理工作原理,可以从C++内存分配开始。 - CodeCaster
1
我推荐使用《CLR via C#》这本书来打牢 .net 基础。所有这些概念都被讲解得非常好。 - CodeMad
2个回答

16

new操作符是在CLR中实现的。它从垃圾回收堆中分配内存并执行类构造函数。

GCHandle.Alloc()并不相同。它利用GC中的另一种机制来创建对象的引用,这些引用存储在单独的表中,并且在垃圾回收期间除了正常发现的对象引用之外还会被扫描。您必须向Alloc()传递一个现有的对象引用,它会添加另一个引用。有助于创建弱引用和固定引用,并允许非托管代码存储对托管对象的引用并使其保持活动状态。C++/CLI中的gcroot<>模板类也利用了它。


10

对象创建的所有内容都隐藏在newobj操作码后面(值类型使用initobj)。因此,内存的分配方式和位置以及与其他内存管理结构的关联是完全实现细节


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接