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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2013, 17:03   #1
Пaвeл
Пользователь
 
Аватар для Пaвeл
 
Регистрация: 08.11.2008
Сообщений: 47
По умолчанию Работа с памятью в С++

Возможно ли в конструкторе класса вызвать его-же деструктор и после этого бросить исключение с его последующей обработкой уже где-нибудь в мейне.
И если я в мейне создаю ссылку на объект класса вот так:

...
class A* my_class;
try {
my_class = new A();
} catch (...) {
...
}
...

будет ли утечка по памяти?
Я не знаю, как должно быть, но вы делаете всё не правильно ©

Последний раз редактировалось Пaвeл; 13.10.2013 в 17:18.
Пaвeл вне форума Ответить с цитированием
Старый 13.10.2013, 18:33   #2
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

стоп, что будет деструктор удалять, если конструктор еще не завершил создание объекта?? как Вы себе это представляете... какое-то извращение
Igor95 вне форума Ответить с цитированием
Старый 13.10.2013, 20:49   #3
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

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

Цитата:
Сообщение от Igor95 Посмотреть сообщение
стоп, что будет деструктор удалять, если конструктор еще не завершил создание объекта?? как Вы себе это представляете... какое-то извращение
Ну я так понимаю что при вызове конструктора класса сразу выделяется память под его поля и указатели на методы, и собственно ссылку на нее мне и возвращает new. Разве не этим занимается конструктор по умолчанию? А вот когда я хочу еще и как-то забить значения полей, то я пишу уже свой собственный конструктор (с блэкджеком и девочками), в котором мне доступно поле this, указывающее на положение этого объекта в памяти. Соответственно при нештатной ситуации (которая может, в принципе, случиться и в конструкторе) я память должен освободить, но в мейне я сделать этого не смогу т.к. бросив исключение в конструкторе, new мне уже не вернет указатель на объект и память будет утеряна безвозвратно, поэтому я и вызывая деструктор в конструкторе.
Я не знаю, как должно быть, но вы делаете всё не правильно ©
Пaвeл вне форума Ответить с цитированием
Старый 13.10.2013, 21:33   #5
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от Пaвeл Посмотреть сообщение
Ну я так понимаю что при вызове конструктора класса сразу выделяется память под его поля и указатели на методы, и собственно ссылку на нее мне и возвращает new. Разве не этим занимается конструктор по умолчанию? А вот когда я хочу еще и как-то забить значения полей, то я пишу уже свой собственный конструктор (с блэкджеком и девочками), в котором мне доступно поле this, указывающее на положение этого объекта в памяти. Соответственно при нештатной ситуации (которая может, в принципе, случиться и в конструкторе) я память должен освободить, но в мейне я сделать этого не смогу т.к. бросив исключение в конструкторе, new мне уже не вернет указатель на объект и память будет утеряна безвозвратно, поэтому я и вызывая деструктор в конструкторе.
Правило хорошего тона. В конструкторе не хорошо вызывать функции объекта. (не говоря о деструкторе). Ну если хотите можете проинспектировать, увидите как прога улетает в fail. хотя функции в конструкторе я всё же использую.... например Clear() или DefParm() ну не люблю я дублировать код.
===================
ээ в одной старой книге Янга прочитал, что не есть хорошо не описывать конструкторы и деструкторы, а оставить это на усмотрение компила. особенно если речь о конструкторе копий.
===================
На сколько я знаю, если конструктор не выполнил свою часть работы в new будет NULL
Если помог, тут весы есть , Вам не сложно, а мне приятно.

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

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
мне больше интересно другое, за и н**? с какой целью это необходимо.
Допустим необходимо распарсирить файл. Файл имеет совершенно определенную структуру: он состоит из заголовка и собственно данных. Заголовок представляет собой 2 поля: тип и длинна в байтах. Данные представлены в таком же формате как и сам файл. Соответственно я считываю файл в память, и кидаю ссылку на нее в качестве аргумента конструктору класса. Внутри класса в зависимости от прочитанного типа я создаю объект класса вызывая для него необходимый конструктор и передаю ему уже ссылку на данные. Тот в свою очередь анализирует полученный тип и т.д. до терминальных классов. А теперь представим, что в анализируемом файле содержатся ошибки (ну вот такой вот косячный файл попался ). В таком случае вполне возможно что программа полезет в чужую память, за что будет схвачена операционкой и посланна ко всем чертям.
Вот что бы такого не получилось я передаю в качестве аргумента конструктору еще и длину считанного файла и при его разборе всегда с ней сверяюсь, что бы не выползти за отведенное мне пространство. И если получается что память кончилась, а я все еще сижу в конструкторе, то ничего не остается кроме того как кинуть исключение ну и очистить перед этим загаженное место.
Я не знаю, как должно быть, но вы делаете всё не правильно ©
Пaвeл вне форума Ответить с цитированием
Старый 13.10.2013, 21:42   #7
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от Пaвeл Посмотреть сообщение
Допустим необходимо распарсирить файл. Файл имеет совершенно определенную структуру: он состоит из заголовка и собственно данных. Заголовок представляет собой 2 поля: тип и длинна в байтах. Данные представлены в таком же формате как и сам файл. Соответственно я считываю файл в память, и кидаю ссылку на нее в качестве аргумента конструктору класса. Внутри класса в зависимости от прочитанного типа я создаю объект класса вызывая для него необходимый конструктор и передаю ему уже ссылку на данные. Тот в свою очередь анализирует полученный тип и т.д. до терминальных классов. А теперь представим, что в анализируемом файле содержатся ошибки (ну вот такой вот косячный файл попался ). В таком случае вполне возможно что программа полезет в чужую память, за что будет схвачена операционкой и посланна ко всем чертям.
Вот что бы такого не получилось я передаю в качестве аргумента конструктору еще и длину считанного файла и при его разборе всегда с ней сверяюсь, что бы не выползти за отведенное мне пространство. И если получается что память кончилась, а я все еще сижу в конструкторе, то ничего не остается кроме того как кинуть исключение ну и очистить перед этим загаженное место.
т.е. есть объект, который в конструкторе порождает другие объекты а те в свою очередь другие?
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 13.10.2013, 21:48   #8
Пaвeл
Пользователь
 
Аватар для Пaвeл
 
Регистрация: 08.11.2008
Сообщений: 47
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
в одной старой книге Янга прочитал, что не есть хорошо не описывать конструкторы и деструкторы, а оставить это на
усмотрение компила. особенно если речь о конструкторе копий.
Ну так с этим никто и не спорит и эта истинна еще много где написана...

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
На сколько я знаю, если конструктор не выполнил свою часть работы в new будет NULL
Так в этом и вся проблема
Я не знаю, как должно быть, но вы делаете всё не правильно ©
Пaвeл вне форума Ответить с цитированием
Старый 13.10.2013, 21:52   #9
Пaвeл
Пользователь
 
Аватар для Пaвeл
 
Регистрация: 08.11.2008
Сообщений: 47
По умолчанию

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

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

Последний раз редактировалось Perchik71; 13.10.2013 в 22:05.
Perchik71 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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