Ошибка Valgrind при проверке утечки памяти в C++

Я пытаюсь выяснить использование Valgrind, поэтому я создал простую программу, но кажется, что Valgrind выдает странную ошибку, когда я делаю динамическое выделение памяти в классе.

Моя программа:

class Valgrind_testclass
{
 Valgrind_testclass *Obj;
public:
  Valgrind_testclass() { 
    // Obj = new Valgrind_testclass();  // Test point #3
  }
  ~Valgrind_testclass() {
    //delete Obj;               // Test point #4
  }
};

int main()
{
 Valgrind_testclass valObj;
 // Valgrind_testclass * valObjPtr = new Valgrind_testclass();  // Test point #1
 //delete valObjPtr;                 // Test point #2
 return 0;
}

С закомментированными контрольными точками Valgrind дает мне следующее:

==5273== HEAP SUMMARY:
==5273==     in use at exit: 0 bytes in 0 blocks
==5273==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated

я полагаю, это ожидаемый результат.

Теперь, когда я раскомментирую тестовую точку № 1:

==5288== HEAP SUMMARY:
==5288==     in use at exit: 4 bytes in 1 blocks
==5288==   total heap usage: 1 allocs, 0 frees, 4 bytes allocated
==5288== 
==5288== Searching for pointers to 1 not-freed blocks
==5288== Checked 102,116 bytes
==5288== 
==5288== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1

что снова является правильным результатом, так как я не выполняю удаление.

С тестом № 2 без комментариев я получаю:

==5300== HEAP SUMMARY:
==5300==     in use at exit: 0 bytes in 0 blocks
==5300==   total heap usage: 1 allocs, 1 frees, 4 bytes allocated
==5300== 
==5300== All heap blocks were freed -- no leaks are possible

Опять верный результат.

Теперь я раскомментирую тестовую точку № 3 и ожидаю, что Valgrind обнаружит утечку памяти. Вот что я получаю:

==5313== Process terminating with default action of signal 11 (SIGSEGV)
==5313==  Access not within mapped region at address 0xBE17AFE4
==5313==    at 0x40263A0: operator new(unsigned int) (vg_replace_malloc.c:255)
==5313==  If you believe this happened as a result of a stack
==5313==  overflow in your program's main thread (unlikely but
==5313==  possible), you can try to increase the size of the
==5313==  main thread stack using the --main-stacksize= flag.
==5313==  The main thread stack size used in this run was 8388608.
==5313== Stack overflow in thread 1: can't grow stack to 0xbe17afe0
==5313== 
==5313== Process terminating with default action of signal 11 (SIGSEGV)
==5313==  Access not within mapped region at address 0xBE17AFE0
==5313==    at 0x402040C: _vgnU_freeres (vg_preloaded.c:58)
==5313==  If you believe this happened as a result of a stack
==5313==  overflow in your program's main thread (unlikely but
==5313==  possible), you can try to increase the size of the
==5313==  main thread stack using the --main-stacksize= flag.
==5313==  The main thread stack size used in this run was 8388608.
==5313== 
==5313== HEAP SUMMARY:
==5313==     in use at exit: 1,047,576 bytes in 261,894 blocks
==5313==   total heap usage: 261,894 allocs, 0 frees, 1,047,576 bytes allocated
==5313== 
==5313== Searching for pointers to 261,894 not-freed blocks
==5313== Checked 5,339,952 bytes
==5313== 
==5313== LEAK SUMMARY:
==5313==    definitely lost: 0 bytes in 0 blocks
==5313==    indirectly lost: 0 bytes in 0 blocks
==5313==      possibly lost: 0 bytes in 0 blocks
==5313==    still reachable: 1,047,576 bytes in 261,894 blocks
==5313==         suppressed: 0 bytes in 0 blocks
==5313== Reachable blocks (those to which a pointer was found) are not shown.
==5313== To see them, rerun with: --leak-check=full --show-reachable=yes
==5313== 
==5313== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 17 from 6)

Я не уверен, почему я не вижу подобную ошибку утечки памяти здесь. Может ли кто-нибудь помочь в понимании этой ситуации, если я делаю что-то не так. Я использую команду Valgrind:

valgrind -v --tool=memcheck --leak-check=full --num-callers=40  ./ValgrindOutput 

Спасибо.

2 ответа

Решение

Это потому что у вас бесконечная рекурсия

Valgrind_testclass является новым для Valgrind_testclass, который является новым для другого Valgrind_testclass... до бесконечности

Программа не закончилась должным образом. То, на что вы смотрите, - это ошибка переполнения стека.

Конструктор делает new Valgrind_testclass(), который вызывает конструктор. Бесконечная рекурсия!

Другие вопросы по тегам