【问题标题】:Using C# Pointers使用 C# 指针
【发布时间】:2011-05-18 00:41:07
【问题描述】:

c# 如何使用指针?如果 C# 是一种托管语言并且垃圾收集器在防止内存泄漏和正确释放内存方面做得很好,那么在 c# 中使用指针的效果是什么以及如何“不安全强>”是吗?

【问题讨论】:

    标签: c# .net pointers


    【解决方案1】:

    要使用指针,您必须允许不安全代码,并将使用指针的方法标记为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 数据结构,例如更改方法实现。你不能在托管代码中这样做。

    【讨论】:

      【解决方案2】:

      在 C# 中使用指针时(在不安全的代码块中),内存不由框架管理。你有责任管理自己的记忆并自己清理。

      ...因此,我会考虑是否相当“不安全”。

      【讨论】:

      • '内存不是由框架管理'在技术上是不正确的;如果您只是将指针指向托管对象(例如数组),那么内存仍由 CLR 管理,它在 fixed... 时无能为力
      • 你能区分指针和intptr的区别吗?根据您的解释,我会假设 intptr 是指向固定内存的指针?
      【解决方案3】:

      C# 以有限的方式支持指针。在 C# 中,指针只能声明为保存值类型和数组的内存地址。与引用类型不同,默认垃圾回收机制不跟踪指针类型。指针也不允许指向引用类型,甚至是包含引用类型的结构类型。因此,在纯 C# 中,它们的用途相当有限。如果在“不安全”代码中使用,它们将被视为非常不安全(当然!)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-12
        相关资源
        最近更新 更多