GCC:使用删除时的分段错误

时间:2017-02-06 09:12:08

标签: c++ gcc

我使用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;
}  

1 个答案:

答案 0 :(得分:3)

  

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

你在上一句话中自己回答了这个问题:

  

这是未定义的行为。

您似乎期望该程序可预测。 UB是不可预测的。两个&#34; OK&#34;和&#34;分段错误&#34;是可能的行为,并且都不保证行为。