class B
{
int a;
int b;
public:
virtual ~B()
{
printf(“B::~B()\n”);
}
};
class D: public B
{
int c;
public:
virtual ~D()
{
printf(“D::~D()\n”);
}
};
int main()
{
B *pb = new D[2];
delete [] pb;
}
运行出现段错误:
段错误 (core dumped)
原因是什么?
{
int a;
int b;
public:
virtual ~B()
{
printf(“B::~B()\n”);
}
};
class D: public B
{
int c;
public:
virtual ~D()
{
printf(“D::~D()\n”);
}
};
int main()
{
B *pb = new D[2];
delete [] pb;
}
运行出现段错误:
段错误 (core dumped)
原因是什么?
解决方案
5
不要这么干,这是未定义行为,简单地说就是数组没有多态性。
虽然有点麻烦,但是也能好理解,规避也比较简单
虽然有点麻烦,但是也能好理解,规避也比较简单
5
原因是分配的时候,并没有记录每个对象的类型
所以delete的时候,只能根据 指针的类型 delete
这样就不能准确找到每个对象了
假如是 单个对象。虚析构函数是可以准确析构的
数组是多个对象,因此除了第一个外,其他都不能准确析构
所以delete的时候,只能根据 指针的类型 delete
这样就不能准确找到每个对象了
假如是 单个对象。虚析构函数是可以准确析构的
数组是多个对象,因此除了第一个外,其他都不能准确析构
10
new D[2] 返回的类型是D*,中间你转换成B*是你的事,但在delete时你也要delete D*类型
int main() { B *pb = new D[2]; delete [] (D*)pb;