Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> исключение в к онструкторе 
V
    Опции темы
Artemon
Дата 9.7.2011, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Код

class MyEx{};

class C1
{
public:
C1()
     {
     throw MyEx();
     }
};


void main()
{
    
    try
    {
    C1* c = new C1;   // <<<<<<<<<<<<<<<<<
    }
    catch(...)
    {
    }
  
}


Вопрос: будет утечка памяти ?




--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
boostcoder
Дата 9.7.2011, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



конечно.
ведь память сначала выделяется, и только потом выполняется конструктор.
PM WWW   Вверх
Artemon
Дата 9.7.2011, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Дело в том, что на форуме натыкался на тему где какой-то товарищ доказывал, что не в таком случае неважно где память выделена на стеке или в куче, она будет всеравно освобождена.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
boostcoder
Дата 9.7.2011, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



вдай ему истину, товарищу тому  smile 
PM WWW   Вверх
azesmcar
Дата 9.7.2011, 12:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Artemon @  9.7.2011,  11:19 Найти цитируемый пост)
Вопрос: будет утечка памяти ?

Нет, не будет.

Оператор new выделяет память, создает объект (вызывает конструктор) и при исключение очищает память, так-как создание объекта провалилось.

Добавлено через 2 минуты и 54 секунды
Цитата(Artemon @  9.7.2011,  11:33 Найти цитируемый пост)
Дело в том, что на форуме натыкался на тему где какой-то товарищ доказывал, что не в таком случае неважно где память выделена на стеке или в куче, она будет всеравно освобождена. 

Прав товарищ. Иначе любой выброс исключения из конструктора привел бы к утечке памяти.
PM   Вверх
boostcoder
Дата 9.7.2011, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(azesmcar @  9.7.2011,  12:39 Найти цитируемый пост)
Нет, не будет.

 smile 
полагаю, вам все же виднее...

Artemon, приношу свои извинения за дезинформацию. ибо ответил так, как знал сам.

Добавлено через 1 минуту и 1 секунду
Цитата(azesmcar @  9.7.2011,  12:39 Найти цитируемый пост)
при исключение очищает память

деструктор, я так полагаю, вызван не будет?
PM WWW   Вверх
azesmcar
Дата 9.7.2011, 12:46 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(boostcoder @  9.7.2011,  12:43 Найти цитируемый пост)
деструктор, я так полагаю, вызван не будет? 

Нет, ведь объект не был создан, но будут вызваны деструкторы для всех, полностью инициализированных членов.
Цитата

An object that is partially constructed or partially destroyed will have destructors executed for all of its
fully constructed subobjects, that is, for subobjects for which the constructor has completed execution and
the destructor has not yet begun execution.

и это
Цитата

An object that is partially constructed or partially destroyed will have destructors executed for all of its
fully constructed subobjects, that is, for subobjects for which the constructor has completed execution and
the destructor has not yet begun execution. Should a constructor for an element of an automatic array
throw an exception, only the constructed elements of that array will be destroyed. If the object or array was
allocated in a new-expression, the matching deallocation function (3.7.3.2, 5.3.4, 12.5), if any, is called to
free the storage occupied by the object.


главную мысль выделил красным, остальные привел, чтобы из контекста было понятно, что речь идет о выбросе исключения из конструктора, т.е. о частично инициализированных объектах.

Добавлено через 1 минуту и 47 секунд
Цитата(boostcoder @  9.7.2011,  11:24 Найти цитируемый пост)
ведь память сначала выделяется, и только потом выполняется конструктор. 

на самом деле да, но это выполняется в виде транзакции, т.е. при исключении происходит откат.
PM   Вверх
boostcoder
Дата 9.7.2011, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(azesmcar @  9.7.2011,  12:46 Найти цитируемый пост)
да, но это выполняется в виде транзакции, т.е. при исключении происходит откат.

впервые слышу... smile 
просто у меня откуда-то сформированное правило: не писать в конструкторе то, что может выбросить исключение.

понял. спасибо.

PM WWW   Вверх
azesmcar
Дата 9.7.2011, 12:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(boostcoder @  9.7.2011,  12:52 Найти цитируемый пост)
просто у меня откуда-то сформированное правило: не писать в конструкторе то, что может выбросить исключение.

вот из деструктора действительно не стоит
Цитата

The process of calling destructors for automatic objects constructed on the path from a try block to a
throw-expression is called “stack unwinding.” [Note: If a destructor called during stack unwinding exits
with an exception, terminate is called (15.5.1). So destructors should generally catch exceptions and
not let them propagate out of the destructor.


а генерировать исключение в конструкторе вполне нормально, более того, это единственный способ сообщить об ошибке выполнения конструктора.
PM   Вверх
mes
Дата 9.7.2011, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  9.7.2011,  11:52 Найти цитируемый пост)
просто у меня откуда-то сформированное правило: не писать в конструкторе то, что может выбросить исключение.

должно быть правило, чтоб перед выкидом исключения не было "висячих" объектов (т.е. тех которые при раскрутке стека не удалятся, например голые указатель на new-созданный объект)..


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 9.7.2011, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(mes @  9.7.2011,  13:12 Найти цитируемый пост)
должно быть правило, чтоб перед выкидом исключения не было "висячих" объектов (т.е. тех которые при раскрутке стека не удалятся, например голые указатель на new-созданный объект).. 

...и да поможет тебе RAII smile 
PM   Вверх
Artemon
Дата 9.7.2011, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Цитата(mes @  9.7.2011,  13:12 Найти цитируемый пост)
должно быть правило, чтоб перед выкидом исключения не было "висячих" объектов (т.е. тех которые при раскрутке стека не удалятся, например голые указатель на new-созданный объект)..


Не совсем  понятна фраза. Можно раскрыть мысль ?


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Earnest
Дата 9.7.2011, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



В приведенном в первом посте примере предполагается, что исключение может возникнуть из-за неудачного выделения памяти. Представим, что там 2 указателя, по которым память выделяется, а не один. И для первого все выделилось успешно, а для второго - нет. Тогда утечка будет (по первому), т.к. указатели голые, и никто им delete не вызовет.
Кстати, в твоем примере она будет по-любому, без всяких исключений, т.к. ты выделяешь память для временного объекта, который потом теряется. Если буквально смотреть на код.


--------------------
...
PM   Вверх
Artemon
Дата 9.7.2011, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Цитата(Earnest @  9.7.2011,  14:46 Найти цитируемый пост)
В приведенном в первом посте примере предполагается, что исключение может возникнуть из-за неудачного выделения памяти. Представим, что там 2 указателя, по которым память выделяется, а не один. И для первого все выделилось успешно, а для второго - нет. Тогда утечка будет (по первому), т.к. указатели голые, и никто им delete не вызовет.


Понятно.

Спасибо всем за ответы, думаю тема исчерпана.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0667 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.