валгринд не жалуется на повреждение памяти?

0

У меня есть небольшой блок кода как удар

class singler
{
    private:
        singler() { _id = id++; };
    public:
        ~singler() { cout<<"In destructor of "<<_id<<endl;};
        static singler* allocate() { singler* p = new singler(); return p; };
        static int id;
        int _id;
};
int singler::id = 0;
singler& create_new(singler*& ptr)
{
    singler * p = singler::allocate();
    ptr = p;
    return (*p);
}
int main()
{
    singler* ptr;
    singler obj = create_new(ptr);
    delete ptr;
}

Таким образом, вы можете видеть, что деструктор объекта будет вызываться дважды, как доказательство, я скомпилировал и запустил его, он дал результат как

In destructor of 0
In destructor of 0

Проблема в valgrind, она ни на что не жалуется, выход valgrind равен ниже == 2

0408== Memcheck, a memory error detector
==20408== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==20408== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info
==20408== Command: a.out
==20408==
In destructor of 0
In destructor of 0
==20408==
==20408== HEAP SUMMARY:
==20408==     in use at exit: 0 bytes in 0 blocks
==20408==   total heap usage: 1 allocs, 1 frees, 4 bytes allocated
==20408==
==20408== All heap blocks were freed -- no leaks are possible
==20408==
==20408== For counts of detected and suppressed errors, rerun with: -v
==20408== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)

Итак, как эффективно обнаружить этот тип ошибок? (я имею в виду использование какого-либо инструмента, который, по крайней мере, скажет мне, есть ли какие-либо проблемы, и если да, то где это?)

  • 0
    Деструктор вызывается дважды между двумя разными объектами, которые создаются и уничтожаются.
  • 0
    и это точно не c . удаление тега
Показать ещё 2 комментария
Теги:
valgrind
memory-corruption

1 ответ

6
Лучший ответ

В вашей программе нет коррупции, и valgrind отлично работает в вашем случае.

Два объекта действительно созданы. Первый объект выделяется в куче, а второй - копия первого объекта. Вот почему вы видите деструктор, вызываемый дважды.

  • 0
    ага, показывает, что я все еще новичок в C ++, добавил конструктор копирования для идентификации, и он показывает правильно, спасибо за объяснение
  • 0
    @abasu См. правило 3 (или 5 в случае c ++ 11).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню