interior_ptr<type>
是
native pointer
的超集,
native pointer
能做的,
Interior pointer
也一样能做。当垃圾回收器移动对象时,
Interior pointer
能随之移动,并始终指向该对象。
------
《
Pro Visual C++_CLI and the .NET 2.0 Platform
》
p815
Interior
_ptr
可以指向引用句柄、值类型、装箱类型句柄、托管类成员、托管数组的元素。
不能指向引用类型本身。
*ip
是
ip
所值的类型
type
的值
&ip
是
ip
指向托管堆中的地址
pin_ptr<type>
在外部调用托管堆中指针时,垃圾回收过程中该指针会发生改变,引起外部调用的错误。必须使用pin_ptr指针将该指针固定。
pinned pointer
可以指向引用句柄、值类型、托管数组的元素。
不能指向引用类型
,但能指向引用类型的成员(不支持钉住由 new 表达式返回的整个对象。相反,需要钉住内部成员的地址。--MSDN)。可以完成native pointer的所有的功能,如指针比较和指针运算。
都不能由跟踪句柄直接赋值。而是必须由&操作符取地址。因为interior_ptr pin_ptr是独立的类,只能由地址赋值,而不能由托管类型赋值。
int
^ m_int = gcnew int(100);
interior_ptr
<int> ipint = &*m_int; //ok
interior_ptr
<int> ipint = m_int; //error





































Pin_ptr指针使用例子

























非托管代码中的函数void incr(int *i)需要int指针,不能将interior_ptr<int>的ip传递给该函数。因为内部指针会随着垃圾回收改变地址,而将其转换为pin_ptr<int>,就是将地址固定,以供外部函数incr(int* i)调用该指针。
和*指针的转换
正因为
pin_ptr
<>
所指向的地址是固定的,因此才能和*指针转换。而interior_ptr<>无此性质。



interior_ptr
就不可以和*指针转换。
interior_ptr
<
ClassValue
>
pValue
=
&
value;;
ClassValue
*
p
=
pValue;
//
error



值类型的指针
在新语法中,值类型指针分为两种类型:
V*
(限于非 CLR 堆位置)和内部指针
interior_ptr<V>
(允许但不要求托管堆内的地址)。
// may not address within managed heap
V *pv = 0;
// may or may not address within managed heap
interior_ptr<V> pvgc = nullptr;
托管扩展中的下列声明全部映射到新语法中的内部指针。(它们是
System
命名空间内的值类型。)
Int32 *pi; // => interior_ptr<Int32> pi;
Boolean *pb; // => interior_ptr<Boolean> pb;
E *pe; // => interior_ptr<E> pe; // Enumeration
内置类型不被认为是托管类型,尽管它们确实在
System
命名空间内作为类型的别名。