使用unsafe之后可以在代码里使用指针,但我却没找到把指针指向new来的对象的办法,这样就没法使用动态数据结构了。比如像这样写的代码,根本没法通过编译:
Node* p = new Node();这个有办法解决吗?

解决方案 »

  1.   

    听不懂
    Node* p = new Node();这个p不就是新Node示例的指针吗
      

  2.   

    http://wenwen.soso.com/z/q204838990.htm
    你看看这个文章里面说的,编译不通过,设置一下就可以了,你看看有用没
      

  3.   

    谢谢了,但不是这个问题。工程里已经设置了允许不安全,使用指针指向普通变量也没问题,只是想要取得new出来的对象指针就不行了。
      

  4.   

    编译器就这么认定的......它就说不能把Node转化为Node*
      

  5.   

    http://wenku.baidu.com/view/f4ab201959eef8c75fbfb3c8.html楼主看看这个
      

  6.   

    即使用链表,也不需要使用指针的,何况你是对象存储,更不适合使用指针,在.NET中,指针是必须用fixed关键字,或者GCHandle.Alloc方法固定后才能使用的,否则就报错,因为GC随时会清理内存,一旦清理,你上次获得的指针地址就会改变,导致程序异常,这在.NET里面是不安全的,因此编译器直接不让你通过。
    指针一般是用来处理短时间的操作,临时将内存地址固定,你的链表存储在.NET里面绝对不适合用指针。
      

  7.   

    给你一段直接获取对象字节的方法和直接从字节转为对象的方法,和C++兼容,可以直接把C++转成的字节转换为对象(对象必须固定长度)。你可以从中看下指针是如何在.NET里面使用的。        public static unsafe byte[] GetBytes<T>(object obj)
            {
                byte[] arr = new byte[Marshal.SizeOf(obj)];            GCHandle handle = GCHandle.Alloc(obj, GCHandleType.Pinned);
                void* pVer = handle.AddrOfPinnedObject().ToPointer();            fixed (byte* parr = arr)
                {
                    *parr = *(byte*)pVer;
                }            handle.Free();
                return arr;
            }        public static unsafe T GetObject<T>(byte[] bytes) where T : new()
            {
                T rect = new T();
                GCHandle handle = GCHandle.Alloc(rect, GCHandleType.Pinned);
                void* pVer = handle.AddrOfPinnedObject().ToPointer();            fixed (byte* b = bytes)
                {
                    *(byte*)pVer = *b;
                }
                handle.Free();
                return rect;
            }
      

  8.   

    你用结构做节点的话,会是复制的方式,但是用类做节点就不会复制了。Node* p = new Node();
    Node是个结构吗?那应该这样写:
    Node node; 或者Node node = new Node();
    Node*p = &node;对类的实例不能用&取地址。
      

  9.   

    谢谢了,我不知道结构和类还有这样的差别,所以把NOde直接写成了结构。如果用:
    Node node; 或者Node node = new Node();
    Node*p = &node;
    这样的方式的话,有可能被内存回收破坏掉吧?因为生成控制表和使用控制标的是在不同的方法里。我去试试对象看看
      

  10.   

    不行,无法声明指向托管类型的指针,而class定义的给了unsafe还是被托管的。
      

  11.   

    你用类就不要用指针了。
    C#的指针不适合你这种场合。public class Node
        {
            public string Value { get; set; }        public Node Next;
        }
      

  12.   


    You chose a wrong tool. Why not use C++