C ++ try / catch после удаления указателя - PullRequest
0 голосов
/ 07 мая 2018

После того, как я искал, как проверить, удален ли указатель в C ++, я обнаружил, что нет определенного способа, какого-то действительно уродливого обходного пути или умных указателей (сначала я хочу понять, как работают нормальные указатели). У меня вопрос, почему происходит сбой C ++, когда я пытаюсь в try / catch показать значение удаленного указателя? не должен ли он обработать сбой и просто напечатать исключение ??

void main()
{
    int *a = new int[5];

    for (int i = 0; i < 5; i++)
    {
        *(a + i) = i;
    }

    for (int i = 0; i < 5; i++)
    {
        if (*(a + i) != NULL) // useless verify, cuz if it would be NULL, it 
                              //would crash imediately
        {
            cout << (a + i) << ", " << *(a + i) << endl;
        }
    }

    delete a;
    cout << a << ", ";// << *a << endl;

    for (int i = 0; i < 5; i++)
    {
        try{
            cout << (a + i) << ", " << *(a + i) << endl;
        }
        catch (int e)
        {
            cout << "Error: " << e << endl;
        }
    }

    cin.get();
}

Ответы [ 3 ]

0 голосов
/ 07 мая 2018
try{
        cout << (a + i) << ", " << *(a + i) << endl;
    }
    catch (int e)
    {
        cout << "Error: " << e << endl;
    }

Вы можете поймать исключение, только если оно выброшено. Доступ к освобожденной памяти является неопределенным поведением и не вызывает исключения, поэтому ловить нечего.

0 голосов
/ 07 мая 2018

В этом случае исключение не выдается , просто неопределенное поведение . Исключения сделаны для явного перехвата исключений, которые выбрасываются .

Кроме того, используйте delete [] a; вместо delete a; для удаления массива.

Кроме того, когда мы delete запоминаем, память на самом деле не удаляется , но теперь свободна для перезаписи с этого момента.

То, что напечатал бы cout, не говорит о том, был ли указатель deleted.

0 голосов
/ 07 мая 2018

Во-первых, для удаления массива используется синтаксис delete [] a;, во-вторых, ваш блок try catch не предназначен для обработки поврежденного адреса, и, к сожалению, в C ++ отсутствует обработка исключений для нарушения доступа к памяти.

...