为什么在分配时,下面的C++中没有memleaks?

ban*_*nov 4 c++ memory-leaks

以下代码降低了我的信念,即我或多或少地了解C++.为什么valgrind不在这里显示任何memleak?为什么我期待memleaks:

  1. B大于A:它包含一个额外的成员; 所以在分配时应该有类'字段切片.
  2. ~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;
  }
};
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应该被调用时,我混淆了基类指针删除对象.这里只是课堂复制的内容.感谢大家!

lit*_*adv 5

delete a;
Run Code Online (Sandbox Code Playgroud)

aA*,所以A::~A被称为

delete b;
Run Code Online (Sandbox Code Playgroud)

bB*这么B::~B叫.

为什么会出现问题?

类字段的切片?所以啊?你只是将A字段复制*b*a,仅此而已.这里没有记忆丢失.