以下代码降低了我的信念,即我或多或少地了解C++.为什么valgrind不在这里显示任何memleak?为什么我期待memleaks:
B大于A:它包含一个额外的成员; 所以在分配时应该有类'字段切片.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;
}
};
Run Code Online (Sandbox Code Playgroud)
main():
A* a = new A;
B* b = new B;
*a = *b;
delete a;
delete b;
Run Code Online (Sandbox Code Playgroud)
UPD:对我感到羞耻!当虚拟dtor应该被调用时,我混淆了基类指针删除对象.这里只是课堂复制的内容.感谢大家!
delete a;
Run Code Online (Sandbox Code Playgroud)
a是A*,所以A::~A被称为
delete b;
Run Code Online (Sandbox Code Playgroud)
b被B*这么B::~B叫.
为什么会出现问题?
类字段的切片?所以啊?你只是将A字段复制*b到*a,仅此而已.这里没有记忆丢失.