LuoJi_1995 LuoJi_1995
关注数: 0 粉丝数: 862 发帖数: 29,459 关注贴吧数: 40
又来求教……还是安全性问题~ 考虑一个array结构,ref< array<T> >有T &operator [] (int)。但是这是不安全的,例如下面的代码: ref< array<int> > arr = gcnew < array<int> > (10); //长度为10 int &refer = arr[5]; arr = null; //清空引用 gc::gc::collect(); //这时之前创建的数组已经被回收 refer = 100; //oh, oh! 实际上对于上面的arr[5],其实是个友好写法,array<T>实现了接口i_enumerable<T>,实现了方法 T &at(int); 它返回其位于第一个参数指定位置的元素的引用,而arr[5]实际上等效于arr->at(5)。 如何阻止这个现象呢? A、建立一个accessor模板,使用accessor<T>访问任何可能引起不安全因素的对象或原生类型,accessor<T>中保存对数组的引用,但是accessor有两种表现方式: ---a. 表现为值类型,这必须使用get委托和set委托(委托总是安全的,因为引用类型的委托保存一个对引用类型的引用),而委托的大量创建会降低效率。(注意到输入数据的情况) ---b. 表现为引用类型,这需要将ref<accessor<T> >特化,使得 = 运算符友好,但是这会增加xnet的混乱度,并且也要在托管堆上创建对象。(注意到输入数据的情况) B、约定不得在数组对象不可达的时候仍然保存对数组对象内的元素的引用或指向元素们的指针(这个引用指的是C++原生的引用,而不是xnet的ref<T>)。 C、要求必须使用arr->get_at(index)和arr->set_at(index, value)。这会使得语法很奇葩。 D、请提出更好的安全的方式。 另外关于C#中的不安全代码,是否应该在xnet中支持呢?
首页 1 2 3 4 下一页