Соорудил класс исключения
- Код: Выделить всё
class FunctionalException
{
public:
FunctionalException(DWORD dwErrorCode, LPTSTR pszErrSource, LPTSTR pszErrMessage, ...);
DWORD GetErrorCode();
LPTSTR GetErrMessage();
LPTSTR GetErrSource();
private:
DWORD dwErrorCode;
LPTSTR pszErrMessage;
LPTSTR pszErrSource;
};
Генерирую исключение в где-то в коде
- Код: Выделить всё
throw FunctionalException(666, TEXT("Хай пипл"), TEXT("1 "), TEXT("2 "), TEXT("3 "));
Все хорошо - исключение ловится. Но нужно еще освободить память под строки в классе исключения.
Определяем деструктор класса исключения.
- Код: Выделить всё
~FunctionalException();
И прописываем ему
- Код: Выделить всё
FunctionalException::~FunctionalException()
{
MessageBox(NULL, TEXT("Деструктор"), GetErrMessage(), MB_OK);
free(this->pszErrMessage);
}
Проверяем. Получается бред. Первое что бросается в глаза - дважды вызывается деструктор.
Проверяем this в деструкторе - получается вызывается деструктор для двух разных объектов.
Погуглил погуглил.
Нагуглил вот что
после вызова
- Код: Выделить всё
throw FunctionalException(666, TEXT("Хай пипл"), TEXT("1 "), TEXT("2 "), TEXT("3 "));
Происходит уничтожение объекта, но перед этим копируется в вызывающий стековый фрейм с помощью конструктора копирования.
В итоге в
- Код: Выделить всё
catch(FunctionalException& e)
Попадает уже не оригинал объекта, а его копия.
Ну а так как указатели копируются, деструктор освобождает строки при первом вызове, на втором вызове уже невалидные указатели.
Значит нужно переопределить конструктор копирования.
- Код: Выделить всё
FunctionalException(const FunctionalException& OtherClass);
И код
- Код: Выделить всё
FunctionalException::FunctionalException(const FunctionalException& OtherClass)
{
MessageBox(NULL, TEXT("Копия"), TEXT("Hi"), MB_OK);
dwErrorCode = OtherClass.dwErrorCode;
pszErrMessage = OtherClass.pszErrMessage;
pszErrSource = OtherClass.pszErrSource;
}
Запускаем - все работает. Деструктор вызывается один раз.
Но вот здесь то и вопрос. MessageBox "Копия" не появляется, отладить на конструкторе копий невозможно (не останавливается). Что бы я не передавал в переменные класса исключения - ему плевать (хоть пустые указатели передавай).
Почему не выполняется конструктор копирования, но тем не менее вроде бы все работает не понятно.
Помогите понять
UPD:: обновил