2017-02-06 75 views
-1

我使用delete以去除使用new []創建對象時段故障。這是未定義的行爲。但是爲什麼在下一個程序中,這個操作會導致不同的結果?在第二種情況下,分段錯誤,並且在第一個中沒有。GCC:使用刪除

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

它應該是'刪除[] pa'因爲你故意刪除*陣列*。 –

+2

'A * PC =新的char [5];'不被編譯... – Jarod42

回答

3

但爲什麼要在接下來的程序,該操作會導致不同的結果?

你已經回答了自己在前面的句子:

這是不確定的行爲。

看來你期望程序是可預測的。 UB不可預測。 「確定」和「分段錯誤」都是可能的行爲,兩種行爲都不能保證。