2012-10-21 13 views
0

我編寫了一個測試C++程序來檢查valgrind的輸出。該代碼是爲什麼valgrind在64位程序中報告指針的大小爲4字節

#include <iostream> 

void f() { 
    int *pp = new int(1); 
    std::cout << "pp is " << *pp << "\n"; 
} 

int main() { 
    f(); 
    return 0; 
} 

我用的valgrind命令是

valgrind --leak-check=yes ./a.out 

從Valgrind的輸出是

==2255== HEAP SUMMARY: 
==2255==  in use at exit: 4 bytes in 1 blocks 
==2255== total heap usage: 1 allocs, 0 frees, 4 bytes allocated 
==2255== 
==2255== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1 
==2255== at 0x4C2B1C7: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==2255== by 0x400786: f() (in /run/shm/a.out) 
==2255== by 0x4007CC: main (in /run/shm/a.out) 
==2255== 
==2255== LEAK SUMMARY: 
==2255== definitely lost: 4 bytes in 1 blocks 
==2255== indirectly lost: 0 bytes in 0 blocks 
==2255==  possibly lost: 0 bytes in 0 blocks 
==2255== still reachable: 0 bytes in 0 blocks 
==2255==   suppressed: 0 bytes in 0 blocks 

我使用的是Ubuntu的機器: Linux的太陽3.2.0-27 -generic#43-Ubuntu SMP Fri Jul 6 14:25:57 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

gcc版本我用 「4.6.3」

GCC參數 「-g -m64」

我覺得應該是八個字節,對不對?

回答

2

不,它不應該是8個字節,除非你的平臺上有sizeof(int)==8

您正在分配和泄漏單個int,而不是指針。

+0

是的。我認爲你是對的,因爲int在我的平臺上是4個字節。 –

0

您不分配指針數組,而是分配一個大小爲1的整數數組。所以你只在內存中分配一個整數的大小。唯一的指針是存儲新分配數組的地址的本地變量。

如果要分配指針,請執行void **arr = new void*[1];

+0

我測試了你的輸入,你的代碼確實顯示8個字節丟失了。 –

+0

是的,因爲64bit平臺上的指針一般都是8字節長。 – tomahh

+0

我將馬特的回答標記爲我的問題的答案,因爲他是第一個回答。 –

相關問題