|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
13.10.2013, 17:03 | #1 |
Пользователь
Регистрация: 08.11.2008
Сообщений: 47
|
Работа с памятью в С++
Возможно ли в конструкторе класса вызвать его-же деструктор и после этого бросить исключение с его последующей обработкой уже где-нибудь в мейне.
И если я в мейне создаю ссылку на объект класса вот так: ... class A* my_class; try { my_class = new A(); } catch (...) { ... } ... будет ли утечка по памяти?
Я не знаю, как должно быть, но вы делаете всё не правильно ©
Последний раз редактировалось Пaвeл; 13.10.2013 в 17:18. |
13.10.2013, 18:33 | #2 |
Форумчанин
Регистрация: 03.01.2013
Сообщений: 388
|
стоп, что будет деструктор удалять, если конструктор еще не завершил создание объекта?? как Вы себе это представляете... какое-то извращение
|
13.10.2013, 20:49 | #3 |
С++, Delphi
Форумчанин
Регистрация: 24.11.2012
Сообщений: 495
|
мне больше интересно другое, за и н**? с какой целью это необходимо.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
|
13.10.2013, 21:12 | #4 |
Пользователь
Регистрация: 08.11.2008
Сообщений: 47
|
Ну я так понимаю что при вызове конструктора класса сразу выделяется память под его поля и указатели на методы, и собственно ссылку на нее мне и возвращает new. Разве не этим занимается конструктор по умолчанию? А вот когда я хочу еще и как-то забить значения полей, то я пишу уже свой собственный конструктор (с блэкджеком и девочками), в котором мне доступно поле this, указывающее на положение этого объекта в памяти. Соответственно при нештатной ситуации (которая может, в принципе, случиться и в конструкторе) я память должен освободить, но в мейне я сделать этого не смогу т.к. бросив исключение в конструкторе, new мне уже не вернет указатель на объект и память будет утеряна безвозвратно, поэтому я и вызывая деструктор в конструкторе.
Я не знаю, как должно быть, но вы делаете всё не правильно ©
|
13.10.2013, 21:33 | #5 | |
С++, Delphi
Форумчанин
Регистрация: 24.11.2012
Сообщений: 495
|
Цитата:
=================== ээ в одной старой книге Янга прочитал, что не есть хорошо не описывать конструкторы и деструкторы, а оставить это на усмотрение компила. особенно если речь о конструкторе копий. =================== На сколько я знаю, если конструктор не выполнил свою часть работы в new будет NULL
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Последний раз редактировалось Perchik71; 13.10.2013 в 21:38. |
|
13.10.2013, 21:33 | #6 |
Пользователь
Регистрация: 08.11.2008
Сообщений: 47
|
Допустим необходимо распарсирить файл. Файл имеет совершенно определенную структуру: он состоит из заголовка и собственно данных. Заголовок представляет собой 2 поля: тип и длинна в байтах. Данные представлены в таком же формате как и сам файл. Соответственно я считываю файл в память, и кидаю ссылку на нее в качестве аргумента конструктору класса. Внутри класса в зависимости от прочитанного типа я создаю объект класса вызывая для него необходимый конструктор и передаю ему уже ссылку на данные. Тот в свою очередь анализирует полученный тип и т.д. до терминальных классов. А теперь представим, что в анализируемом файле содержатся ошибки (ну вот такой вот косячный файл попался ). В таком случае вполне возможно что программа полезет в чужую память, за что будет схвачена операционкой и посланна ко всем чертям.
Вот что бы такого не получилось я передаю в качестве аргумента конструктору еще и длину считанного файла и при его разборе всегда с ней сверяюсь, что бы не выползти за отведенное мне пространство. И если получается что память кончилась, а я все еще сижу в конструкторе, то ничего не остается кроме того как кинуть исключение ну и очистить перед этим загаженное место.
Я не знаю, как должно быть, но вы делаете всё не правильно ©
|
13.10.2013, 21:42 | #7 | |
С++, Delphi
Форумчанин
Регистрация: 24.11.2012
Сообщений: 495
|
Цитата:
Если помог, тут весы есть , Вам не сложно, а мне приятно.
|
|
13.10.2013, 21:48 | #8 | |
Пользователь
Регистрация: 08.11.2008
Сообщений: 47
|
Цитата:
Так в этом и вся проблема
Я не знаю, как должно быть, но вы делаете всё не правильно ©
|
|
13.10.2013, 21:52 | #9 |
Пользователь
Регистрация: 08.11.2008
Сообщений: 47
|
ага, получается такая матрешка и кроме как разбором по классам ее не написать (ну в смысле красиво не написать, гавнокодом можно и без всего этого обойтись ) А так для каждого типа пишем свой класс для его обработки и сильно не паримся. Соответственно остается расширяемость кода что есть хорошо)
Я не знаю, как должно быть, но вы делаете всё не правильно ©
|
13.10.2013, 21:59 | #10 |
С++, Delphi
Форумчанин
Регистрация: 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. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
работа с памятью | 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 |