следующий код опровергает мое убеждение, что я знаю C ++ более или менее.Почему valgrind
не показывает здесь никакой утечки памяти?Почему я ожидаю memleaks:
B
больше, чем A
: он содержит дополнительный элемент;поэтому при присваивании должна быть нарезка полей класса. - ~ A () не имеет виртуального dtor.Поэтому, когда мы вызываем
delete a
, должен вызываться только ~A()
, и память, выделенная в B., теряется.
Но я получаю, что порядок вызова dtors: ~ A (), ~ B (), ~ A ().Почему?!
struct A {
~A()
{
std::cerr << "~A" << std::endl;
}
};
struct B : A {
int* data;
B() : data(new int[20]) {}
~B()
{
std::cerr << "~B" << std::endl;
delete [] data;
}
};
main()
:
A* a = new A;
B* b = new B;
*a = *b;
delete a;
delete b;
UPD: Позор мне!Я запутал удаление объекта указателем базового класса, когда должен вызываться виртуальный dtor.Вот только содержимое класса copying.Спасибо всем!