GCC:使用删除时出现分段错误

GCC: segmentation fault when using delete

本文关键字:分段 错误 删除 GCC      更新时间:2023-10-16

我使用 delete 删除使用 new [] 创建的对象。这是未定义的行为。但是为什么在下一个程序中,此操作会导致不同的结果?在第二种情况下,分段错误,在第一种情况下没有任何内容。

class A {
    public:
        A() {std::cout << "A::A()" << std::endl;}
        ~A() {std::cout << "A::~A()" <<std::endl;}
};
int main() {
    //1:
    char* pc = new char[5];
    delete pc; //OK
    //2:
    A* pa = new A[5];
    delete pa; //Segmentation fault
    return 0;
}  

但是为什么在下一个程序中,此操作会导致不同的结果?

你在上一句话中已经回答了这个问题:

这是未定义的行为。

您似乎期望该程序是可预测的。UB 是不可预测的。"正常"和"分段错误"都是可能的行为,这两种行为都不能保证。