Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2011, 07:56   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
Вопрос Вброс исключения с использованием new

Вот имеется такой отрывок кода:
Код:
#include <iostream>

using namespace std;

class MyClass
{
    public:
        MyClass()
        {
            cout << "In constructor()" << endl;
        }
        ~MyClass()
        {
            cout << "In destructor()" << endl;
        }
};

int main()
{
    try
    {
        throw new MyClass();
    }
    catch(...)
    {
        cout << "An exception" << endl;
    }
    cin.get();
    return 0;
}
Однако, выводится только
In constructor()
An exception
А вот про деструктор ни слова, хотя в Code::Blocks вызов деструктора легко отследить, но он там просто не происходит. Почему так? Ведь получается, что происходит утечка памяти, не так ли?

Или можно так?
Код:
try
{
    throw new MyClass();
}
catch(MyClass* ex)
{
    cout << "An exception" << endl;
    delete ex;
}

Последний раз редактировалось _-Re@l-_; 13.08.2011 в 07:58.
_-Re@l-_ вне форума Ответить с цитированием
Старый 13.08.2011, 10:38   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

естественно нужно удалять что создали(кстати у вас тип исключения MyClass* выходит)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.08.2011, 10:43   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Спасибо, Пепел Феникса. И всё-таки это как-то не очень удалять исключения, потому как если работаешь со сторонней библиотекой, никогда не знаешь, как там реализован вброс исключений.
_-Re@l-_ вне форума Ответить с цитированием
Старый 13.08.2011, 10:54   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

значит бросайте сам объект а не указатель на него.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.08.2011, 10:57   #5
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
значит бросайте сам объект а не указатель на него.
Я ж сказал
Цитата:
потому как если работаешь со сторонней библиотекой, никогда не знаешь, как там реализован вброс исключений.
Я не про то, что моей библиотекой будут пользоваться, а про то, что некоторые библиотеки вбрасывают указатель, и это .. мм... не очень.
_-Re@l-_ вне форума Ответить с цитированием
Старый 13.08.2011, 13:28   #6
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
некоторые библиотеки вбрасывают указатель, и это .. мм... не очень.
Перехват исключений по указателю совсем не тру. Если библиотеки делают так, то их писали немного неадекватные программисты и пользоваться ими - себе дороже.
still_alive вне форума Ответить с цитированием
Старый 13.08.2011, 16:01   #7
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Ваше throw выражение создает временный объект, который инициализируется вашим выражением. Так как значением вашего выражения является указатель, то и создается указатель. Этот-то указатель и удаляется в блоке catch. Но удаляется не с помощью delete, а удаляется как локальная переменная.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 13.08.2011, 17:33   #8
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Сыроежка, не понял, что вы имели ввиду. Удаляется указатель или освобождается память выделенная для объекта исключения?
В общем, сразу после delete происходит вызов деструктора MyClass() - проверял. Помните, что если программист выделяет память в куче, то он сам и должен её освобождать. Насколько я помню, в противном случае случается утечка памяти.

Вот, даже набросал кое-чего для проверки
Код:
class MyExcept
{
    public:
        MyExcept(const char* m) : mess(m)
        {
            cout << "construct of " << mess << endl;
        }
        ~MyExcept()
        {
            cout << "destruct of " << mess << endl;
        }
        const char* mess;
};

int main()
{
    try
    {
        throw new MyExcept("hello world");
    }
    catch(MyExcept* ex)
    {
        cout << "MyExcept exception" << endl;
        delete ex;
    }
    cin.get();
    return 0;
}
Вот, сразу после delete ex выводится "destruct of hello world".

Последний раз редактировалось _-Re@l-_; 13.08.2011 в 17:52.
_-Re@l-_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Стек и исключения Sibedir Общие вопросы Delphi 7 20.04.2011 20:28
Исключения в Qt iukash Qt и кроссплатформенное программирование С/С++ 6 16.04.2011 18:54
Исключения C++ Impuls1989 Помощь студентам 2 04.03.2011 00:51
Исключения yurik1982 Фриланс 9 16.02.2010 00:34
Исключения Rifler Общие вопросы Delphi 5 12.11.2008 00:29