在本文中,我將解釋為什么使用本地指針來(lái)管理對(duì)象。原因在于對(duì)象是以垃圾收集器移動(dòng)的。所以,當(dāng)對(duì)象移動(dòng)時(shí),本地指針就變成無(wú)效的。所以,如果你想取得一個(gè)托管對(duì)象的本地指針,你就會(huì)遇到一個(gè)編譯錯(cuò)。下面的代碼顯示了這上點(diǎn)。
using namespace System;
int _tmain()
{
int ^ hnd = gcnew int(100);
int* np = &hnd; // Genarates a compile error
}
但是本地指針還是非常有用的,如在使用指針?biāo)阈g(shù)和指針比較時(shí)就有許多的優(yōu)點(diǎn)。所以新的C++ CLI允許你使用一個(gè)內(nèi)部指針實(shí)現(xiàn)同樣的功能。內(nèi)部指針是本地指針的一個(gè)超集。所以它能夠做任何內(nèi)部指針?biāo)茏龅囊磺小?但是當(dāng)垃圾收集器移動(dòng)指針?biāo)赶虻膶?duì)象時(shí),內(nèi)部指針也幫助程序?qū)崿F(xiàn)其指向的地址的更新。
現(xiàn)在讓我們看一下如何用內(nèi)部指針來(lái)實(shí)現(xiàn)指針?biāo)阈g(shù)運(yùn)算。
#include "stdafx.h"
#include
using namespace System;
using namespace stdcli::language;
int _tmain()
{
const int SIZE = 10;
array^ arr = gcnew array(SIZE);
for(int idx = 0; idx < SIZE; idx++)
{
arr[idx] = idx + 1;
}
// 取得指向數(shù)組第一個(gè)元素的指針
interior_ptr p = &arr[0];
// 通過(guò)增加指針值讀取并輸出數(shù)組元素
for(int idx = 0; idx < 10; idx++)
{
printf("Value of the element at %Xh ", p);
Console::WriteLine(" is {0}",*(p++));
}
Console::ReadLine();
}
不管垃圾收集器執(zhí)行多少次和數(shù)組元素移動(dòng)多少次,上面的代碼仍然能工作良好。于是C++的力量又回到了.Net運(yùn)行時(shí)刻庫(kù)上。但是要小心使用內(nèi)部指針。這些指針與本地指針?lè)浅O嗨?,?dāng)試圖存取不允許操作的內(nèi)存區(qū)段時(shí)能給程序造成危害。例如,如果我在上面的代碼中試圖存取下一個(gè)p++,它將返回恰好在上面數(shù)組元素上方4字節(jié)的內(nèi)存段位置。
using namespace System;
int _tmain()
{
int ^ hnd = gcnew int(100);
int* np = &hnd; // Genarates a compile error
}
但是本地指針還是非常有用的,如在使用指針?biāo)阈g(shù)和指針比較時(shí)就有許多的優(yōu)點(diǎn)。所以新的C++ CLI允許你使用一個(gè)內(nèi)部指針實(shí)現(xiàn)同樣的功能。內(nèi)部指針是本地指針的一個(gè)超集。所以它能夠做任何內(nèi)部指針?biāo)茏龅囊磺小?但是當(dāng)垃圾收集器移動(dòng)指針?biāo)赶虻膶?duì)象時(shí),內(nèi)部指針也幫助程序?qū)崿F(xiàn)其指向的地址的更新。
現(xiàn)在讓我們看一下如何用內(nèi)部指針來(lái)實(shí)現(xiàn)指針?biāo)阈g(shù)運(yùn)算。
#include "stdafx.h"
#include
using namespace System;
using namespace stdcli::language;
int _tmain()
{
const int SIZE = 10;
array^ arr = gcnew array(SIZE);
for(int idx = 0; idx < SIZE; idx++)
{
arr[idx] = idx + 1;
}
// 取得指向數(shù)組第一個(gè)元素的指針
interior_ptr p = &arr[0];
// 通過(guò)增加指針值讀取并輸出數(shù)組元素
for(int idx = 0; idx < 10; idx++)
{
printf("Value of the element at %Xh ", p);
Console::WriteLine(" is {0}",*(p++));
}
Console::ReadLine();
}
不管垃圾收集器執(zhí)行多少次和數(shù)組元素移動(dòng)多少次,上面的代碼仍然能工作良好。于是C++的力量又回到了.Net運(yùn)行時(shí)刻庫(kù)上。但是要小心使用內(nèi)部指針。這些指針與本地指針?lè)浅O嗨?,?dāng)試圖存取不允許操作的內(nèi)存區(qū)段時(shí)能給程序造成危害。例如,如果我在上面的代碼中試圖存取下一個(gè)p++,它將返回恰好在上面數(shù)組元素上方4字節(jié)的內(nèi)存段位置。

