1

Valgrind の基本的な理解を得て、その出力を解釈するのに苦労するために、次のコードを書きました。これはおそらく Valgrind とは関係ありませんが、より基本的な C++ とは関係ありません。

#include <string>
#include <iostream>
using namespace std;

class Valgrind_testclass
{
std::string * stringInHeap;

public:
  Valgrind_testclass() { 
    stringInHeap = new std::string("String in heap");   
  }
  ~Valgrind_testclass() {
    //delete stringInHeap;                  
  }

  void PrintFunc(void) {
    cout << "Nothing but a printout" << endl;
  }
};

int main()
{
 Valgrind_testclass * valObjPtr = new Valgrind_testclass();  
 delete valObjPtr;               
 return 0;
}

Valgrind の出力:

==4459== HEAP SUMMARY:
==4459==     in use at exit: 31 bytes in 2 blocks
==4459==   total heap usage: 3 allocs, 1 frees, 35 bytes allocated
==4459== 
==4459== Searching for pointers to 2 not-freed blocks
==4459== Checked 102,100 bytes
==4459== 
==4459== 31 (4 direct, 27 indirect) bytes in 1 blocks are definitely lost in loss record 2 of 2
==4459==    at 0x402641D: operator new(unsigned int) (vg_replace_malloc.c:255)
==4459==    by 0x80487DB: Valgrind_testclass::Valgrind_testclass() (in /home/madu/C++/ValgrindTest)
==4459==    by 0x80486F6: main (in /home/madu/C++/ValgrindTest)
==4459== 
==4459== LEAK SUMMARY:
==4459==    definitely lost: 4 bytes in 1 blocks
==4459==    indirectly lost: 27 bytes in 1 blocks
==4459==      possibly lost: 0 bytes in 0 blocks
==4459==    still reachable: 0 bytes in 0 blocks
==4459==         suppressed: 0 bytes in 0 blocks
==4459== 
==4459== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 17 from 6)

誰かが私が3つの割り当てを行う場所を教えてもらえますか? 割り当ては 2 つしか表示されません。また、「間接的に失われた」と書かれているのはなぜですか?

ありがとうございました。

4

2 に答える 2

9

オブジェクトを構築するstd::stringと、文字列値を指す別のポインター (オブジェクトの内部) が割り当てられます。これが 3 番目の割り当ての元であり、間接的にリークしたメモリでもあります。

つまり、次の 3 つの割り当てがあります。

  1. new Valgrind_testclass()(明示的)
  2. new std::string("String in heap")(明示的)
  3. 文字列内部割り当て (暗黙的/間接的)

割り当て 2 をリークしたため、間接的に割り当て 3 もリークしました。文字列のデストラクタは呼び出されないため、割り当て 3 を解放する機会がありません。

于 2012-07-23T15:42:15.450 に答える
4

std::stringもメモリを割り当てるため、3 つの割り当てがあります。

間接的に失われたとは、他のメモリへのポインターを持っていた何かへのポインターを失ったことを意味します。この場合、あなたは を削除しておらずstringInHeap、ポインタを失っています。それにより、実際std::stringにメモリを割り当てた人はそれを削除できなかったため、そのメモリも失われます。

于 2012-07-23T15:42:41.977 に答える