2017-02-06 3 views
-1

Я использую delete для удаления объекта, созданного с помощью new []. Это неопределенное поведение. Но почему в следующей программе эта операция приводит к другому результату? Во втором случае - ошибка сегментации, а в первом - ничего.GCC: ошибка сегментации при использовании delete

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

Это должно быть 'delete [] pa', потому что вы намерены удалить массив *. –

+2

'A * pc = new char [5];' не следует компилировать ... – Jarod42

ответ

3

Но почему в следующей программе, эта операция приводит к иному результату?

Вы ответили, что сами в предыдущем предложении:

Это неопределенное поведение.

Кажется, что вы ожидаете, что программа будет предсказуемой. UB не предсказуем. И «ОК», и «Ошибка сегментации» являются возможными поведением, и ни одно поведение не гарантируется.

Смежные вопросы