Code Bye

删除对象指针为什么会出现段错误

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)
原因是什么?
解决方案

5

不要这么干,这是未定义行为,简单地说就是数组没有多态性。
虽然有点麻烦,但是也能好理解,规避也比较简单

5

原因是分配的时候,并没有记录每个对象的
所以delete的时候,只能根据 指针的型 delete
这样就不能准确找到每个对象了
假如是 单个对象。虚析构函数是可以准确析构的
数组是多个对象,因此除了第一个外,其他都不能准确析构

10

new D[2] 返回的型是D*,中间你转换成B*是你的事,但在delete时你也要delete D*
int  main()
{
	B *pb = new D[2];
	delete []  (D*)pb;

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明删除对象指针为什么会出现段错误