C++指標漂移問題解決方案

來源:互聯網
上載者:User

  C++程式設計語言雖然功能強大,應用方式靈活,但是在實際編程中同樣會出現各種各樣的錯誤。在這裡我們將會為大家詳細介紹一下有關C++指標漂移的解決方案,希望本文介紹的內容可以協助大家解決問題。

  最近我們在工作中碰到一個奇怪的問題,最後確定是多繼承引起的C++指標漂移,跟C++物件模型有關。示意如下:

  class A {...}; class B{...}; class AB : public B, public A {...} ... AB *pab = new AB(); A* pa = (A*)pab; B* pb = (B*)pab; 這時候你發現pa和pb的值是不一樣的!它們中有一個跟pab是相等的,而另外一個產生了位移。如果把AB的聲明中A和B的順序調換一下,則產生位移的指標也會變為另外一個。

  為了確定這是編譯器做了轉換的緣故,利用void指標愚弄編譯器:

  void *pv = (void*)pab; pa = (A*)pv; 這時候pa的值倒是跟pab相等了,然而指向了錯誤的地方。從pab到pa的轉換,依賴於路徑的選擇,讓人不是很放心。還不知道把指標放入容器中再取出來,會不會出錯。當然,上面使用了強制類型轉換,在良好的程式中應該避免。如果只有隱式轉換,可以得到正確的結果:

  std::vector v; //implicit type conversion v.insert(v.begin(), pab); void *pv = v[0]; pa = (A*)pv; 以下程式使用Cygwin/g++b編譯通過:

  #include #include class A { public: int a; }; class B { public: int b; }; class AB : public B, public A { public: int ab; }; int main(int argc, char **argv) { AB *pab = new AB(); pab->ab = 1; pab->b = 2; pab->a = 3; A* pa = (A*)pab; B* pb = (B*)pab; printf( "AB: %pn" " A: %pn" " B: %pn", pab, pa, pb); std::vector v; //implicit type conversion v.insert(v.begin(), pab); void *pv = v[0]; pa = (A*)pv; printf("pv is %pnpa is %pnpab %s pvn", pv, pa, (pab == pv) ? "==" : "!="); printf("A.a is %dn", pa->a); //forced type conversion pv = (void*)pab; pa = (A*)pv; printf("Now A.a is %dn", pa->a); } 運行結果:

  AB: 0x6b01f0 A: 0x6b01f4 B: 0x6b01f0 pv is 0x6b01f4 pa is 0x6b01f4 pab != pv A.a is 3 Now A.a is 2

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.