删除C++对象时崩溃


Crashed when i delete a c++ object

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
When to use virtual destructors?

[第二个迪西]嗨,伙计们!你们都在谈论虚拟析构函数。我还想到了基类的析构函数。但另一个考验是:甲类{公众:(){}虚拟虚空乐趣(){}私人:int;};

当A类有一个虚拟函数(而不是虚拟去流通器)时,没关系。删除ptra没问题!

所以,我认为a只需要一个vptr来激活多态性。非类as
destructor must be virtual.
Class A
的析构函数不是虚拟的,只是可以使资源不被释放。正确地。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class A
{
 public:
  A()
  {
  }
  /*virtual*/ ~A()
  {
  }
 private:
  int mIntA;
};

class B : public A
{
public:
 B()
 {
  mIntB = 1234;
 }

 virtual ~B()
 {
  int i = 0;
 }

private:
 int mIntB;
};

我有一个A类和一个从A派生的B类;a没有任何虚拟函数。所以当我这样做的时候:

1
2
A* ptrA = new B;
delete ptrA;

它崩溃了!

但是当给A加上一个虚拟的乐趣时,没关系。如我们所知,ptra是一个b对象。但是为什么呢?


您有一个非虚拟析构函数!

(这意味着当调用析构函数时,调用的是a的析构函数,而不是b的,即使对象被分配为b)


A类不是多态的,因此删除不可能知道ptrA实际上指向一个分配的块,因此释放崩溃。