В среде разработки поймать try catch

473
05 февраля 2017, 12:57

В этом коде, а точнее в блоке try {} выпадает ошибка

try {
    data = (char*)realloc(data, value);
}
catch (...) {
    data = (char*)realloc(data, value);
}

Хочу поставить метку в блоке catch, чтобы отловить ошибку. Почему то в Visual Studio не работает... Нужны какие-то настройки?

Многие пишут, что realloc не даёт исключений... ещё как даёт, вот простейший пример:

#include "stdafx.h"
#include "stdlib.h"

int main()
{
    char *a = (char*)malloc(10);
    free(a);
    a = (char*)realloc(a, 20);
    return 0;
}
Answer 1

Начнем с того, что realloc никаких исключений не генерирует.
Продолжим тем, что если даже вы обратитесь по нулевому адресу - это будет не исключение C++, а вовсе даже * асинхронное структурированное исключение*. К которому try/catch не имеет отношения.
Но если очень хочется - то в VC++ можно использовать ключик /EHa, который позволяет try/catch ловить и эти исключения. Попробуйте с ним...

Но, откровенно говоря, я бы не рекомендовал им пользоваться - неприятностей больше, чем выгоды.

Answer 2

Многие пишут, что realloc не даёт исключений... ещё как даёт, вот простейший пример:

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

// тут выделили память, все ок.
char *a = (char*)malloc(10);
// освободили память, тоже ок. Но free не меняет значение указателя. Он продолжает указывать на тот же кусок памяти.
free(a);
// а теперь пытаемся обратиться к этой памяти...
a = (char*)realloc(a, 20);

Что на самом деле делает realloc? если сильно упростить, то он выделяет новую память нужного размера, копирует старую память на новое место, а старую память освобождает. Но любой программист знает, что если сделать дважды free для указателя - получишь ошибку. Примерный код realloc можно подсмотреть и там нет никаких явных бросаний исключений.

Так что же за "исключение"? Отладчик и компилятор знают о том, что программист может сделать ошибку. И в дебажном режиме добавляют всяких проверок. И если что то происходит не так - сразу перехватывает.

То есть, Вы видите исключение не от realloc, а он дебажного менеджера памяти и отладчика, которые перехватили ситуацию двойного освобождения памяти (а может обращение к освобожденной памяти, но это менее вероятно) и ругают Вас.

READ ALSO
анализаторы утечки памяти С/С++ [дубликат]

анализаторы утечки памяти С/С++ [дубликат]

На данный вопрос уже ответили:

498
Ошибка сегментации (C++ в ubuntu 16.04)

Ошибка сегментации (C++ в ubuntu 16.04)

Программа выдаёт ошибку сегментации при обращении к последнему элементу двумерного массива в цикле его обработкиБолее того, она имеет странные...

403
Работа функции std::time()

Работа функции std::time()

Что будет с функцией std::time(0), когда количество секунд, прошедших с 1970 года превысит максимально возможное хранимое число в возвращаемом типе?

422