C++/CLI剪輯
阿新 • • 發佈:2018-04-04
load() con class 過程 afa 托管 垃圾回收 指針 opened
1.本地類中包含托管類成員變量的情況
1 #include<vcclr.h> // 必須包含vcclr.h頭文件 2 3 //傳入 4 5 A^ a = gcnew A(); 6 7 gcroot<A^> *pA = new gcroot<A^>(); 8 9 *pA = a; 10 11 void *ptr = pA; 12 13 B *b = new B(pA); //c++類 14 15 //還原 16 17 gcroot<A^> * m_pA = (gcroot<A^> *)pA; 18 19 (*m_pA)->FuncA(); //可調用A類接口;
2.pin_ptr是防止您的對象移動將在垃圾回收堆的內部指針. 也就是說釘住指針的值不是由公共語言運行時更改. 當向非托管函數傳遞托管類的地址時,這很有用,因為在解析非托管函數調用的過程中,該地址不會意外更改.
pin_ptr無法使用情況(在pin_ptr的生命周期內有效):
-
-
函數參數
-
作為函數的返回類型。
-
類成員的聲明
-
目標的類型約束。
-
pin_ptr 數組的第一個元素的位置
1 // pin_ptr_1.cpp 2 // compile with: /clr 3 using namespace System; 4 #defineView CodeSIZE 10 5 6 #pragma unmanaged 7 // native function that initializes an array 8 void native_function(int* p) { 9 for(int i = 0 ; i < 10 ; i++) 10 p[i] = i; 11 } 12 #pragma managed 13 14 public ref class A { 15 private: 16 array<int>^ arr; // CLR integer array17 18 public: 19 A() { 20 arr = gcnew array<int>(SIZE); 21 } 22 23 void load() { 24 pin_ptr<int> p = &arr[0]; // pin pointer to first element in arr 25 int* np = p; // pointer to the first element in arr 26 native_function(np); // pass pointer to native function 27 } 28 29 int sum() { 30 int total = 0; 31 for (int i = 0 ; i < SIZE ; i++) 32 total += arr[i]; 33 return total; 34 } 35 }; 36 37 int main() { 38 A^ a = gcnew A; 39 a->load(); // initialize managed array using the native function 40 Console::WriteLine(a->sum()); 41 }
內部指針轉換為釘住的指針,並且,類型為返回 address-of 運算符 (&) 是內部指針,當操作數在托管堆時
1 // pin_ptr_2.cpp 2 // compile with: /clr 3 using namespace System; 4 5 ref struct G { 6 G() : i(1) {} 7 int i; 8 }; 9 10 ref struct H { 11 H() : j(2) {} 12 int j; 13 }; 14 15 int main() { 16 G ^ g = gcnew G; // g is a whole reference object pointer 17 H ^ h = gcnew H; 18 19 interior_ptr<int> l = &(g->i); // l is interior pointer 20 21 pin_ptr<int> k = &(h->j); // k is a pinning interior pointer 22 23 k = l; // ok 24 Console::WriteLine(*k); 25 };View Code
釘住的指針轉換為另一種類型
1 // pin_ptr_3.cpp 2 // compile with: /clr 3 using namespace System; 4 5 ref class ManagedType { 6 public: 7 int i; 8 }; 9 10 int main() { 11 ManagedType ^mt = gcnew ManagedType; 12 pin_ptr< int > pt = &mt->i; 13 *pt = 8; 14 Console::WriteLine(mt->i); 15 16 char *pc = ( char* ) pt; 17 *pc = 255; 18 Console::WriteLine(mt->i); 19 }View Code
C++/CLI剪輯