C#中的Unsafe和Fixed

简介: 托管代码 (managed code):由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。
托管代码 (managed code):由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动
垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。 非托管代码(Unmanaged Code):在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支
持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。
Unsafe的代码介于这两者之间,它也是在CLR的环境中执行,但是我们可以直接操作内存。只要我们的代码包含下面三个指针操作符之一就需要使用Unsafe
关键字:
  • *
  • &
  • ->

例如:

unsafe static void ChangeValue(int* pInt)
    {
        *pInt = 23;
    }

上面的代码由于是在CLR下托管执行,为了减少内存碎片C#的自动垃圾回收机制会允许已经分配的内存在运行时进行位置调整,所以如果我们多次调用的话就可能
导致指针指向其他的变量。比如*pInt为指向一个变量的地址为1001,CLR在重新内存整理分配后该变量就存储在地址为5001的地方。而原来1001的地方可能会
被分配其他变量,要解决这个问题我们就需要使用Fixed关键字。

fixed 语句禁止垃圾回收器重定位可移动的变量。fixed 语句只能出现在不安全的上下文中。Fixed 还可用于创建固定大小的缓冲区。如下面例子:

using System;
class CaryData
{
    public int data;
}

class CProgram
{
   
    unsafe static void ChangeValue(int* pInt)
    {
        *pInt = 23;
    }

    public unsafe static void Main()
    {
        CaryData cd = new CaryData();
        Console.WriteLine("改变前: {0}", cd.data);        

        fixed (int* p = &cd.data)
        {
            ChangeValue(p);
        }
        Console.WriteLine("改变后: {0}", cd.data);
    }
}

注意要勾选项目属性中生成标签的允许不安全代码。

 
http://www.cnblogs.com/carysun/archive/2009/11/07/csharp-unsafe.html
    
相关文章
解决报错:AddressSanitizer: heap-buffer-overflow
leetcode使用AddressSanitizer检查内存是否存在非法访问。报此错,主要是访问了非法内容。 解决方法:数组访问越界,导致此错,后来发现是在访问二维数组的边界row和col弄反了。。
2918 0
|
1月前
|
前端开发
使用display:inline-block会产生什么问题?解决方法?
【10月更文挑战第27天】使用`display: inline-block`时可能会出现空白间隙和垂直对齐等问题,但通过上述相应的解决方法,可以有效地克服这些问题,实现更精确、更美观的页面布局效果。
|
4月前
|
API 计算机视觉
Using ‘value‘ pointer is unsafe and deprecated. Use NULL as value pointer. To fetch trackbar value s
本文讨论了OpenCV中使用`createTrackbar`时遇到的"Using ‘value’ pointer is unsafe and deprecated"警告,并提供了通过设置空指针或使用回调函数来解决这个问题的方法。
Using ‘value‘ pointer is unsafe and deprecated. Use NULL as value pointer. To fetch trackbar value s
|
Java API
【Unsafe】
【Unsafe】
runtime: goroutine stack exceeds 1000000000-byte limit fatal error: stack overflow
runtime: goroutine stack exceeds 1000000000-byte limit fatal error: stack overflow
294 0
|
安全 前端开发 Java
Unsafe 和 Atomic 详解(上)
在JDK 5之后,Java类库中才开始使用CAS操作,该操作由sun.misc.Unsafe类里面的 compareAndSwapInt()和compareAndSwapLong()等几个方法包装提供。HotSpot虚拟机在内部对这些方法做了特殊处理,即时编译出来的结果就是一条平台相关的处理器CAS指令,没有方法调用的过程, 或者可以认为是无条件内联进去了。
146 0
|
Java
Unsafe 和 Atomic 详解(下)
在JDK 5之后,Java类库中才开始使用CAS操作,该操作由sun.misc.Unsafe类里面的 compareAndSwapInt()和compareAndSwapLong()等几个方法包装提供。HotSpot虚拟机在内部对这些方法做了特殊处理,即时编译出来的结果就是一条平台相关的处理器CAS指令,没有方法调用的过程, 或者可以认为是无条件内联进去了。
102 0