使用GDB 分析C 類的記憶體分布

2021-06-21 16:35:23 字數 3437 閱讀 2326

首先,**如下:

1 

2 #include 3 #include 4

5 class cfox

6 ;13

14 cfox::cfox(void)

15 18

19 void cfox::print(void)

20 23

24 class imyclass

25 31 protected:

32     int id;

33     char name[16];

34 };

35 36 imyclass::imyclass(void)

37 41 class cmyclass : public imyclass

42 47 private:

48     cfox *pfox;

49 };

50 51 cmyclass::cmyclass(void)

52 55 void cmyclass::doaction(int id)

56 61     else

62    

65 66     this->id = 0xabcdef;

67 68 }

69 70 71 int main(void)

72

在函式 cmyclass::doaction()裡設定斷點,在執行完這個函式最後乙個賦值語句的時候,停下來。

此時,執行gdb命令:

(gdb) where

#0 cmyclass::doaction (this=0x11008, id=0) at test_class.cpp:68

#1 0x00008b38 in main () at test_class.cpp:75

(gdb) p *this

$1 =

process 544

start addr end addr size offset objfile

0x8000 0x9000 0x1000 0x0 /mnt/test_class

0x10000 0x11000 0x1000 0x0 /mnt/test_class

0x11000 0x32000 0x21000 0x0 [heap]

0xb6d39000 0xb6e64000 0x12b000 0x0 /lib/libc-2.19.so

0xb6e64000 0xb6e6c000 0x8000 0x12b000 /lib/libc-2.19.so

0xb6e6c000 0xb6e6e000 0x2000 0x12b000 /lib/libc-2.19.so

0xb6e6e000 0xb6e6f000 0x1000 0x12d000 /lib/libc-2.19.so

0xb6e6f000 0xb6e72000 0x3000 0x0

0xb6e72000 0xb6e8f000 0x1d000 0x0 /lib/libgcc_s.so.1

0xb6e8f000 0xb6e97000 0x8000 0x1d000 /lib/libgcc_s.so.1

0xb6e97000 0xb6e98000 0x1000 0x1d000 /lib/libgcc_s.so.1

0xb6e98000 0xb6f02000 0x6a000 0x0 /lib/libm-2.19.so

0xb6f02000 0xb6f09000 0x7000 0x6a000 /lib/libm-2.19.so

0xb6f09000 0xb6f0a000 0x1000 0x69000 /lib/libm-2.19.so

0xb6f0a000 0xb6f0b000 0x1000 0x6a000 /lib/libm-2.19.so

0xb6f0b000 0xb6fc4000 0xb9000 0x0 /lib/libstdc++.so.6.0.18

0xb6fc4000 0xb6fcb000 0x7000 0xb9000 /lib/libstdc++.so.6.0.18

0xb6fcb000 0xb6fcf000 0x4000 0xb8000 /lib/libstdc++.so.6.0.18

0xb6fcf000 0xb6fd1000 0x2000 0xbc000 /lib/libstdc++.so.6.0.18

---type to continue, or q to quit---

0xb6fd1000 0xb6fd7000 0x6000 0x0

0xb6fd7000 0xb6ff6000 0x1f000 0x0 /lib/ld-2.19.so

0xb6ffa000 0xb6ffd000 0x3000 0x0

0xb6ffd000 0xb6ffe000 0x1000 0x0 [sigpage]

0xb6ffe000 0xb6fff000 0x1000 0x1f000 /lib/ld-2.19.so

0xb6fff000 0xb7000000 0x1000 0x20000 /lib/ld-2.19.so

0xbefdf000 0xbf000000 0x21000 0x0 [stack]

0xffff0000 0xffff1000 0x1000 0x0 [vectors]

可以看出,this是在heap裡的。

(gdb) p &name

$4 = (char (*)[16]) 0x11010

(gdb) p pfox

$5 = (cfox *) 0x11028

(gdb) p &this->id

$6 = (int *) 0x1100c

然後,看下this 所在的 heap的記憶體:

(gdb) x /20w this

0x11008: 0x00008ce0 0x00abcdef 0x6c707041 0x00000065

0x11018: 0x00000000 0x00000000 0x00011028 0x00000011

0x11028: 0x0000000a 0x00000000 0x00000000 0x00020fd1

0x11038: 0x00000000 0x00000000 0x00000000 0x00000000

0x11048: 0x00000000 0x00000000 0x00000000 0x00000000

C 類記憶體分布

成員變數依據宣告的順序進行排列 類內偏移為0開始 成員函式不佔記憶體空間 上部分為成員變數,下部分為虛表 當建立乙個含有虛函式的父類的物件時,編譯器在物件構造時將虛表指標指向父類的虛函式 同樣,當建立子類的物件時,編譯器在建構函式裡將虛表指標 子類只有乙個虛表指標,它來自父類 指向子類的虛表 這個虛...

C 中類的記憶體分布

如何計算類物件占用的位元組數?乙個空類的話1個位元組。這是為了保證n個連續空類宣告時,變數位址有偏移,防止變數覆蓋。非空類的話用關鍵字sizeof計算。如果手工計算就相當麻煩,光padding就一堆規則了。而且有些額外資訊比如虛函式 多個虛函式也只產生乙個vptr指標 等等。乙個類成員 當有虛函式時...

C 類記憶體結構分析

本文的目標是闡述清楚 c 的類相關的記憶體結構問題。這個問題對於已經很了解的人來說,太簡單了,這還有必要拿出來與人分享嗎?但對於那些不了解的人,始終有一層窗戶紙不能被捅破,似乎總是不能非常到位的理解本質。本文的闡述過程會分為幾個階段,類與物件的關係,物件到底是什麼,類的函式時如何被處理的,多型是如何...