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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2013, 22:08   #11
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Правило хорошего тона. В конструкторе не хорошо вызывать функции объекта. (не говоря о деструкторе).
Почему нехорошо вызывать функции объекта?

Цитата:
Разве не этим занимается конструктор по умолчанию?
Конструктор по умолчанию никаким выделением памяти не занимается.

Цитата:
Соответственно при нештатной ситуации (которая может, в принципе, случиться и в конструкторе) я память должен освободить, но в мейне я сделать этого не смогу т.к. бросив исключение в конструкторе, new мне уже не вернет указатель на объект и память будет утеряна безвозвратно, поэтому я и вызывая деструктор в конструкторе.
При возникновении исключения в конструкторе компилятор сам освобождает память этого объекта. И неважно, был он на стеке или в куче.

Цитата:
На сколько я знаю, если конструктор не выполнил свою часть работы в new будет NULL
Неа.
still_alive вне форума Ответить с цитированием
Старый 13.10.2013, 22:14   #12
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Почему нехорошо вызывать функции объекта?
потому что он ещё не создан. логично?
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 13.10.2013, 22:22   #13
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
потому что он ещё не создан. логично?
Нет. Вызвать функции-члены, которые помогут мне инициализировать объект - это плохо?
still_alive вне форума Ответить с цитированием
Старый 13.10.2013, 22:26   #14
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от still_alive Посмотреть сообщение
Нет. Вызвать функции-члены, которые помогут мне инициализировать объект - это плохо?
в книгах говорится, что вызов функции-членов объекта, который ещё не создан плохо.

для ясности:

телефон не создан, но он уже умеет звонить.
звучит прикольно.

работает, скорее всего из-за того, что адрес члена функции имеет жёскую структуру. и её можно предвидеть.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 13.10.2013, 22:32   #15
Пaвeл
Пользователь
 
Аватар для Пaвeл
 
Регистрация: 08.11.2008
Сообщений: 47
По умолчанию

Цитата:
Сообщение от still_alive Посмотреть сообщение
При возникновении исключения в конструкторе компилятор сам освобождает память этого объекта. И неважно, был он на стеке или в куче.
А если необходимо прибить еще и созданные классом объекты? Я так понимаю что при исключении вызывается не деструктор а лишь освобождение полей и ссылок на методы.
Я не знаю, как должно быть, но вы делаете всё не правильно ©
Пaвeл вне форума Ответить с цитированием
Старый 13.10.2013, 22:35   #16
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от Пaвeл Посмотреть сообщение
А если необходимо прибить еще и созданные классом объекты? Я так понимаю что при исключении вызывается не деструктор а лишь освобождение полей и ссылок на методы.
полюбе но всё ещё зависит от компила.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 13.10.2013, 22:38   #17
Пaвeл
Пользователь
 
Аватар для Пaвeл
 
Регистрация: 08.11.2008
Сообщений: 47
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
Утечка будет.
Избежать как я вижу есть 2 способа:
1) отказаться от этой затеи в самих конструкторах.
2) создать два абстрактных объекта:
к примеру CCheckObject, он предок всех объектов за исключением главного.
и в нём уже будет this и его даже не нужно передавать. и если произошла ошибка вызвать внутри себя Free() который вызовит уничтожение всех объектов от его имени, которые содержат его parent.
и CCheckObjectManager класс предок главного. в нём хранятся все this каждого объекта, желательно в архитектуре дерева. или связного списка. и если произошла ошибка в отдельном объекте она вызывает Free() этого this.... если это будет в виде дерева можно всю ветвь уничтожить. тем самым частично открылся файл... восстанавливайте господа.
====
если CCheckObjectManager использовать, то можно в исключении не вызывать free а сообщить manager об ошибке объект номер такой. она находит его проверяет на имение деток и к херам всё семейство по штучно.
====
и даже не нужен main итд сообщалка будет реализована в самом манагере. можно даже сделать так что описать её в самом CObject, как виртуал а манагер от него унаследован. тогда вобще можно всё в пределах объектно-ориентированного подхода.
Да, идея прикольная, но вот хочется понять почему нет возможности грохнуть инициализирующийся объект а потом всем сказать об этом с помощью исключения.

В принципе из коментов по теме я так понял что если я в конструкторе напишу
...
delete this;
throw 0x01;
...
то сначала деструктор грохнит объект, а потом еще и после работы исключения повторно будет попытка очистить уже пустую память, что и приведет к ошибке.
Я правильно понял?
Я не знаю, как должно быть, но вы делаете всё не правильно ©
Пaвeл вне форума Ответить с цитированием
Старый 13.10.2013, 22:42   #18
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от Пaвeл Посмотреть сообщение
то сначала деструктор грохнит объект, а потом еще и после работы исключения повторно будет попытка очистить уже пустую память, что и приведет к ошибке.
Я правильно понял?
если конечно оно было вот так создано C* c = new C; то только если вызовешь delete с. Если С с; то fail.
=======
отследить удалить или он уже удалён не так просто, ибо c будет далеко не NULL
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 13.10.2013 в 22:44.
Perchik71 вне форума Ответить с цитированием
Старый 13.10.2013, 22:48   #19
Пaвeл
Пользователь
 
Аватар для Пaвeл
 
Регистрация: 08.11.2008
Сообщений: 47
По умолчанию

Все, теперь понятно)
Закодил мини прогу для подтверждения всего вышесказанного
код http://dumpz.org/694629/
лог запуска http://dumpz.org/694636/
Всем спасибо за помощь!
Я не знаю, как должно быть, но вы делаете всё не правильно ©
Пaвeл вне форума Ответить с цитированием
Старый 13.10.2013, 23:31   #20
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
в книгах говорится, что вызов функции-членов объекта, который ещё не создан плохо.
Плохо, но только если функция использует неинициализированные данные объекта. С таким же успехом можно утверждать, что делить плохо, потому что можно разделить на нуль.

Цитата:
А если необходимо прибить еще и созданные классом объекты? Я так понимаю что при исключении вызывается не деструктор а лишь освобождение полей и ссылок на методы.
Для этого есть идиома RAII - например, умные указатели. При исключении вызываются деструкторы уже сконструированных членов класса.

Цитата:
но всё ещё зависит от компила.
Это прописано в стандарте, а значит не зависит от реализации компилятора.

Цитата:
Да, идея прикольная, но вот хочется понять почему нет возможности грохнуть инициализирующийся объект а потом всем сказать об этом с помощью исключения.
Объект грохается сам, а исключение передается дальше. Я не могу понять, в чем проблема?

Цитата:
отследить удалить или он уже удалён не так просто, ибо c будет далеко не NULL
Где не так просто? Все просто. try-catch в помощь.
still_alive вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с памятью Mr_ViK Win Api 13 16.01.2012 01:53
работа с памятью в VB Mr_ViK Помощь студентам 1 14.01.2012 16:54
Работа с памятью GrihaI Общие вопросы C/C++ 0 14.05.2010 18:18
Работа с памятью getUp Общие вопросы C/C++ 6 19.01.2010 01:11
С# работа с памятью Anton07 Помощь студентам 0 13.12.2009 23:06