【发布时间】:2011-05-18 00:41:07
【问题描述】:
c# 如何使用指针?如果 C# 是一种托管语言并且垃圾收集器在防止内存泄漏和正确释放内存方面做得很好,那么在 c# 中使用指针的效果是什么以及如何“不安全强>”是吗?
【问题讨论】:
c# 如何使用指针?如果 C# 是一种托管语言并且垃圾收集器在防止内存泄漏和正确释放内存方面做得很好,那么在 c# 中使用指针的效果是什么以及如何“不安全强>”是吗?
【问题讨论】:
要使用指针,您必须允许不安全代码,并将使用指针的方法标记为unsafe。然后,您必须修复内存中的所有指针,以确保垃圾收集器不会移动它们:
byte[] buffer = new byte[256];
// fixed ensures the buffer won't be moved and so make your pointers invalid
fixed (byte* ptrBuf = buffer) {
// ...
}
这是不安全的,因为从理论上讲,您可以获取一个指针,遍历整个地址空间,并破坏或更改内部 CLR 数据结构,例如更改方法实现。你不能在托管代码中这样做。
【讨论】:
在 C# 中使用指针时(在不安全的代码块中),内存不由框架管理。你有责任管理自己的记忆并自己清理。
...因此,我会考虑是否相当“不安全”。
【讨论】:
fixed... 时无能为力
C# 以有限的方式支持指针。在 C# 中,指针只能声明为保存值类型和数组的内存地址。与引用类型不同,默认垃圾回收机制不跟踪指针类型。指针也不允许指向引用类型,甚至是包含引用类型的结构类型。因此,在纯 C# 中,它们的用途相当有限。如果在“不安全”代码中使用,它们将被视为非常不安全(当然!)。
【讨论】: