【问题标题】:Virtual Destructor: Not Working?虚拟析构函数:不工作?
【发布时间】:2013-08-06 00:55:48
【问题描述】:

我正在使用 GNU 编译器。 B 类中的虚拟析构函数不调用析构函数 ~D()。谁能告诉我为什么?

#include<iostream>
using namespace std;

class B {
  double* pd;
  public:
  B() {
  pd=new double [20];
  cout<< "20 doubles allocated\n";
  }

  virtual ~B() {   //the virtual destructor is not calling ~D()
  delete[] pd;
  cout<<"20 doubles deleted\n";
  }

  };

class D: public B {
  int* pi;
  public:
  D():B() {
  pi= new int [1000];
  cout<< "1000 ints allocated\n";
  }
  ~D() {
  delete[] pi;
  cout< "1000 ints deleted\n";
  }
  };

int main() {
  B* p= new D; //new constructs a D object

Delete 应该调用 B 类中的虚拟析构函数,但它没有。

  delete p; 
  }

【问题讨论】:

  • cout&lt; "1000 ints deleted\n"; 你打错字了
  • 这应该可以工作(如果它编译,你有一个微不足道的语法错误)。你有什么证据证明它没有?

标签: c++ virtual-destructor


【解决方案1】:

确实如此,您只是看不到输出,因为您有错字:

cout < "1000 ints deleted\n";
//   ^, less than

您的编译器过于宽松,这不应该编译(至少在 C++11 中)。

这可能是因为basic_ios::operator void* 使流对象隐式转换为void*,并且您的编译器允许字符串文字衰减为char*(可转换为void*)。 cout &lt; "x"; 然后简单地使用内置的operator&lt;(void*, void*) 进行指针比较并丢弃结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-06
    • 2013-07-06
    • 2011-08-12
    • 2012-04-13
    • 2012-04-18
    • 2017-03-16
    • 2012-12-20
    • 2014-11-04
    相关资源
    最近更新 更多