• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • C++/CLI思辨錄之內部指針的兩面性

    發表于:2007-05-25來源:作者:點擊數: 標簽:思辨錄之兩面性指針C++
    在本文中,我將解釋為什么使用本地指針來管理對象。原因在于對象是以垃圾收集器移動的。所以,當對象移動時,本地指針就變成無效的。所以,如果你想取得一個托管對象的本地指針,你就會遇到一個編譯錯。下面的代碼顯示了這上點。 using namespace System; in
     在本文中,我將解釋為什么使用本地指針來管理對象。原因在于對象是以垃圾收集器移動的。所以,當對象移動時,本地指針就變成無效的。所以,如果你想取得一個托管對象的本地指針,你就會遇到一個編譯錯。下面的代碼顯示了這上點。

    clearcase/" target="_blank" >cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1">
    using namespace System;
    int _tmain()
    {
     int ^ hnd = gcnew int(100);
     int* np = &hnd; // Genarates a compile error
    }

      但是本地指針還是非常有用的,如在使用指針算術和指針比較時就有許多的優點。所以新的C++ CLI允許你使用一個內部指針實現同樣的功能。內部指針是本地指針的一個超集。所以它能夠做任何內部指針所能做的一切。 但是當垃圾收集器移動指針所指向的對象時,內部指針也幫助程序實現其指向的地址的更新。

      現在讓我們看一下如何用內部指針來實現指針算術運算。

    #include "stdafx.h"
    #include <stdio.h>
    using namespace System;
    using namespace stdcli::language;
    int _tmain()
    {
     const int SIZE = 10;
     array<int>^ arr = gcnew array<int>(SIZE);
     for(int idx = 0; idx < SIZE; idx++)
     {
      arr[idx] = idx + 1;
     }
     // 取得指向數組第一個元素的指針
     interior_ptr p = &arr[0];
     // 通過增加指針值讀取并輸出數組元素
     for(int idx = 0; idx < 10; idx++)
     {
      printf("Value of the element at %Xh ", p);
      Console::WriteLine(" is {0}",*(p++));
     }
     Console::ReadLine();
    }

      不管垃圾收集器執行多少次和數組元素移動多少次,上面的代碼仍然能工作良好。于是C++的力量又回到了.Net運行時刻庫上。但是要小心使用內部指針。這些指針與本地指針非常相似,當試圖存取不允許操作的內存區段時能給程序造成危害。例如,如果我在上面的代碼中試圖存取下一個p++,它將返回恰好在上面數組元素上方4字節的內存段位置。

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>