虚拟破坏者:不工作
Virtual Destructor: Not Working?
我使用的是GNU编译器。类B中的虚拟析构函数不调用析构函数~D()。有人能告诉我为什么吗?
#include<iostream>
using namespace std;
class B {
double* pd;
public:
B() {
pd=new double [20];
cout<< "20 doubles allocatedn";
}
virtual ~B() { //the virtual destructor is not calling ~D()
delete[] pd;
cout<<"20 doubles deletedn";
}
};
class D: public B {
int* pi;
public:
D():B() {
pi= new int [1000];
cout<< "1000 ints allocatedn";
}
~D() {
delete[] pi;
cout< "1000 ints deletedn";
}
};
int main() {
B* p= new D; //new constructs a D object
Delete应该调用类B中的虚拟析构函数,但它没有。
delete p;
}
确实如此,您只是看不到输出,因为您有一个拼写错误:
cout < "1000 ints deletedn";
// ^, less than
你的编译器太宽容了,这不应该编译(至少在C++11中是这样)。
这可能是因为basic_ios::operator void*
使流对象隐式转换为void*
,并且编译器允许字符串文字衰减为char*
(可转换为void*
)。cout < "x";
然后简单地使用内置的operator<(void*, void*)
进行指针比较并丢弃结果。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 虚拟破坏者:不工作