0

valgrind の出力を確認するテスト C++ プログラムを作成しました。コードは

#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 Sun 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」

「-g -m64」を使用したgccパラメーター

私はそれが8バイトであるべきだと思いますよね?

4

2 に答える 2

2

sizeof(int)==8いいえ、あなたのプラットフォームでない限り、8 バイトであってはなりません。

intポインターではなく、単一の を割り当ててリークしています。

于 2012-10-21T14:37:46.413 に答える
0

ポインタ配列ではなく、サイズ1の整数配列を割り当てます。したがって、メモリ内の整数のサイズのみを割り当てています。ポインタである唯一のものは、新しく割り当てられた配列のアドレスを格納するローカル変数です。

ポインタを割り当てたい場合は、void **arr = new void*[1];

于 2012-10-21T14:40:15.933 に答える