我使用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;
}
答案 0 :(得分:3)
但为什么在下一个程序中,此操作会导致不同的结果?
你在上一句话中自己回答了这个问题:
这是未定义的行为。
您似乎期望该程序可预测。 UB是不可预测的。两个&#34; OK&#34;和&#34;分段错误&#34;是可能的行为,并且都不保证行为。