В этом коде, а точнее в блоке 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;
}
Начнем с того, что realloc
никаких исключений не генерирует.
Продолжим тем, что если даже вы обратитесь по нулевому адресу - это будет не исключение C++, а вовсе даже * асинхронное структурированное исключение*. К которому try/catch
не имеет отношения.
Но если очень хочется - то в VC++ можно использовать ключик /EHa
, который позволяет try/catch
ловить и эти исключения. Попробуйте с ним...
Но, откровенно говоря, я бы не рекомендовал им пользоваться - неприятностей больше, чем выгоды.
Многие пишут, что realloc не даёт исключений... ещё как даёт, вот простейший пример:
Вы наблюдаете багу в своем коде, но решили, что это исключение. Что же на самом деле происходит.
// тут выделили память, все ок.
char *a = (char*)malloc(10);
// освободили память, тоже ок. Но free не меняет значение указателя. Он продолжает указывать на тот же кусок памяти.
free(a);
// а теперь пытаемся обратиться к этой памяти...
a = (char*)realloc(a, 20);
Что на самом деле делает realloc? если сильно упростить, то он выделяет новую память нужного размера, копирует старую память на новое место, а старую память освобождает. Но любой программист знает, что если сделать дважды free для указателя - получишь ошибку. Примерный код realloc можно подсмотреть и там нет никаких явных бросаний исключений.
Так что же за "исключение"? Отладчик и компилятор знают о том, что программист может сделать ошибку. И в дебажном режиме добавляют всяких проверок. И если что то происходит не так - сразу перехватывает.
То есть, Вы видите исключение не от realloc, а он дебажного менеджера памяти и отладчика, которые перехватили ситуацию двойного освобождения памяти (а может обращение к освобожденной памяти, но это менее вероятно) и ругают Вас.
Программа выдаёт ошибку сегментации при обращении к последнему элементу двумерного массива в цикле его обработкиБолее того, она имеет странные...
Что будет с функцией std::time(0), когда количество секунд, прошедших с 1970 года превысит максимально возможное хранимое число в возвращаемом типе?
Имеется код, который работает в C++11: