如题,unsafe和fixed可以用于在类的字段中定义指针吗?另外在C#中用什么删除释放指针,我用了下delete,编译器不识。

解决方案 »

  1.   

    也是GC释放,只要不是用GcHandle和Marshal.AllocHGlobal创建的都不用手动释放。
      

  2.   

    那unsafe和fixed可以用于在类的字段中定义指针吗?
      

  3.   

    你要代码吧?不过在类中使用指针是多余的,一个引用类型的字段本身存放的就是首地址。struct中使用还有些许意义。    unsafe class TestClass
        {
            public int* A;
            public TestClass(int[] b)
            {
                fixed(int* p = b)
                {
                    A = p;
                }
            }
        }
        class Program
        {
            unsafe static void Main(string[] args)
            {
                int[] x = new int[10];
                TestClass tc = new TestClass(x);
                *(tc.A + 1) = 255;
                Console.ReadLine();
            }
        }
      

  4.   

    因为做的是图像处理,核心算法是用VC做的,我需要定义很多数组来接受这些返回值,数组的大小也很大,最后还要进行三维显示,我在C#中直接定义数组,运行已报出“内存溢出和虚拟内存太低”的错误了,其实我想解决的是这个问题。
      

  5.   


        [StructLayout(LayoutKind.Sequential)]
        class TestClass
        {
            public byte[] a = new byte[1024 * 1024];
        }
        class Program
        {
            static void Main(string[] args)
            {
                TestClass tc = new TestClass();
                Console.WriteLine(Marshal.SizeOf(tc));
                Console.ReadLine();
            }
        }运行一下这个,这个包含1M数组的类实例,大小是4个字节。因为字段a本身存放的就是数组首地址,所以你定义成指针也没什么意义,直接定义数组类型就可以。“内存溢出和虚拟内存太低”不是c#的原因,是过程存在问题。你以c++指针的思维去理解c#的引用类型,以c++的new理解c#的new,唯一区别就是c++可以手动delete,c#要靠GC,如果问题发生在GC,不妨尝试Marshal类分配和释放内存或者直接调用windows api。
      

  6.   

    没人来了?在类中定义一个数组的指针字段 unsafe public double* resultGradient = new double[CallDLL.width * CallDLL.height * 3]; 这样做是不是不行?因为编译器报错:右边的初始化和左边的double*不匹配。
      

  7.   

    其实我希望定义的这个数组的大小是CallDLL.width * CallDLL.height * 9,CallDLL.width是2048,CallDLL.height是1536,它在类的字段中,编译是没有问题,但我一旦运行,错误就停留在这个字段上,报出“内存不足”,谁能帮忙解决这个问题,不胜感激,加分!!
      

  8.   

    你说的我明白了,这几天忙得都没时间回,我后来把类中的字段用Marshal类进行分配和释放内存。得到数组首地址用的是: Marshal.UnsafeAddrOfPinnedArrayElement  再由IntPtr得到数组用的是: Marshal.Copy 但是引用数组内容时就会报出“尝试读取受保护的内存,这通常指示其它内存已损坏。”后来用ToPointer()由IntPtr得到数组首地址,再结合用unsafe不安全代码去引用数组的内容,不过也是同样的问题。我不知道问题出在哪,该如何解决,还有你说直接用调用windows API怎么用啊?帮忙解决,不胜感激,加分。
      

  9.   

    使用Marshal.AllocHGlobal来分配制定大小的内存,返回IntPtr,内容被写入后进行操作时,再使用Marshal.Copy从IntPtr中拷贝到定义的数组,或者不用定义数组,直接Marshal.ReadByte读取指定位置的字节,这样可以节省一个数组的内存。最后要调用Marshal.FreeHGlobal释放该内存。
      

  10.   

    不好意思,我一直忙得没时间来研究解决这个问题,我确实是这样做的,但是引用和释放的时候确实有问题,一个窗口需要另一个窗口的四个数组内容,我就把这四个数组转化为IntPtr,通过构造函数传递给另一个窗口,再在另一个窗口中通过Marshal.Copy得到对应的数组,但是除得到的第一个数组是可以引用的,其它三个数组引用其中内容就会出错,不过我得到四个数组通过Marshal.Copy是连续用的,是不是连续四次拷贝就会出现问题?而且我释放也有问题,在另一窗口关闭的时候去释放,会报出“句柄无效”的错误。