быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||
1 | ||||||
в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант!26.06.2011, 22:40. Показов 4697. Ответов 55
Метки нет (Все метки)
Собсно
0
|
26.06.2011, 22:40 | |
Ответы с готовыми решениями:
55
Проверить на наличие вирусов после использования программы не вызывающей доверия Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||
27.06.2011, 01:45 [ТС] | 21 | |||||
Тогда всё ещё запутанее.
Вот это путаница. И не по названию, а по сути. И если она появилась вследствие оптимизации, то грош последней цена. Вот, наверное, потому я и отключаю её.
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
27.06.2011, 01:57 | 22 |
В функции main нет никакого объекта, который бы существовал до конца работы программы.. Конструктор копирования в данном случае не вызывается потому, что копировать некуда. Временный же объект, который является результатом вызова этой функции (и в который проискодит копирование при отключённой оптимизации копирования) имеет областью видимости вовсе не main, а лишь ту точку, где его можно было бы использовать при желании, то есть в месте вызова функции. Вот там он сразу же и удаляется. Нет никакой путаницы. Отключать оптимизацию неразумно. Иначе лучше вообще забыть и про C++ и даже про C и программировать сразу на ассемблере.
Добавлено через 1 минуту Этот объект был определён не в функции main. И оттого, что он умер, никому хуже не стало. И не могло стать.
0
|
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
|||||||||||
27.06.2011, 04:38 | 23 | ||||||||||
012015ED вызывается конструктор копирования* 01201608 вызывается деструктор для автоматического объекта теперь в стеке находится объект А и управление возращается в main
* Я изменил программу, добавив явный конструктор копирования
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
27.06.2011, 06:29 | 24 |
Ну с чего ты взял, что в namespace main'a хоть что-то создавалось? Ты вызвал функцию, в ней создался объект, при выходе из функции он уничтожился. Компилятор понимает, что объект А после завершения функции не используется, поэтому не копирует его. А ты этого не понимаешь, поэтому отключаешь оптимизацию. Что я могу ещё сказать - молодец!
1
|
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
|
27.06.2011, 07:33 | 25 |
В дебаг версии VS 2008 копирует, потом уничтожает а. В коде мейн уничтожает копию. В релиз версии он тупо выводит строки cout-ом, никаких объектов А, копий и деструкторов...
mingw дебаг версии действительно не копирует даже
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
27.06.2011, 16:26 [ТС] | 26 |
Не путай меня и не лги. Я нигде не вопрошал- почему КК не вызывается, если объект не возвращается? Потому и не вызывается, что как ты сам сказал "после завершения функции не используется", это я и без тебя знаю.
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
27.06.2011, 16:28 | 27 |
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||
27.06.2011, 16:45 [ТС] | 28 | |||||
Алё, а при чём тут КК? Я спрашивал, почему объект, автоматичный для main, умер, а функция не закончилась ещё pito211 сказал, что "управление над тем объектом A утеряно и удалил его до выхода из области видимости, что впринципе логично"
А где в этой цитате спрашивал, почем не вызывается КК... и так далее? Добавлено через 11 минут pito211,ну да, я это и имел ввиду.
0
|
27.06.2011, 16:54 | 29 |
Как все странно.... Объект класса nemo_ должен удаляться объектом класса xx. Разве что за исключением каких то специализированных случаев когда объект класса xx - всего лишь генератор для объектов класса nemo_. Во втором случае позаботиться об удалении объекта должен тот кто его заказал. Ваш случай похож и в данной реализации вы обязаны освободить память в main (не хотите - переделывайте класс xx в соответствии с условием задачи)
Если же первый случай. В каком методе класса xx будет удаляться объект класса nemo_ неважно. (в т.ч и в деструкторе и в конструкторе). Но объект класса хх должен хранить указатель на объект класса nemo_ Если вас не устраивает такой подход, выберите язык программирования с автоматической сборкой мусора. Добавлено через 6 минут А кажеться дошло о чем вы. Я не совсем в тему ответил похоже
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
27.06.2011, 17:12 [ТС] | 30 |
примерно так, nemo_ на самом деле вложен для в xx и я переопределяю [][]
Ну в общем вывод такой: передаёшь ссыль- позаботься о delete; да всё бы ничё, но её только в main и вызывать; но тут случай, что и не видно, что это ссыль: matrix_ [][] Ладно, остаётся только передавать объект. Как уж я подумаю. Всем спасибо, извините, кого задел.
0
|
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
|
27.06.2011, 17:20 | 31 |
странные у тебя запросы(по поводу самого первого листинга). Думаю в полевых условиях такие вещи впринципе городить не придётся
1
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||
27.06.2011, 17:36 [ТС] | 32 | |||||
Код сырой, можешь сразу посмотреть main
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
27.06.2011, 17:46 | 34 |
kravam, есть какая-то магия, какие-то дикие запросы на то, чтобы в классе matrix хранить именно двойной указатель, а не массив объектов nemo? Потому что пока это выглядит как извращение и хреновое проектирование. Храни вы массив строк, то вы бы просто из operator[] матрицы возвращали ссылку на строку, а из operator[] строки возвращали элемент строки. Недавно эта тема разжёвывалась же.
Вот.
0
|
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
|
27.06.2011, 17:52 | 35 |
зачем интересно нужен конструктор по умолчанию, если он не рабочий спрячь его в приват
Добавлено через 4 минуты лучше перегружать оператор(), а то так ты получается даёшь пользователю поиграться с указателями matrix[]. В терминологии не силён но помоему тут нарушается инкапсуляция или что-то типо того. Но точно что-то из принципов ООП нарушается double temp; в 35 строке неиспользуемая переменная, точнее она только в typeid используется, короче выкинуть её и вобще это всё жуткий быдлокод, весь обплевался пока читал
1
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|||||||||||
27.06.2011, 18:46 [ТС] | 36 | ||||||||||
Советов я ничьих не спрашивал. Это кстати. Всё, что вы сказали- лишнее, могли бы не говорить. Я слишком ответственно отношусь к любому своему код, чтобы не отвечать за каждую строчку
Специально для тех, кто не увидел: это класс шаблонный, предполагается матрица из ЛЮБЫХ авторских переменных
И да, для каждого авторского класса мне придётся переопределять функции, например vivod и не надо мне об этом говорить. "зачем интересно нужен конструктор по умолчанию, если он не рабочий спрячь его в приват" Он рабочий и он нужен. Как нужен конструктор пустой строки или пустого вектора, ОК? "лучше перегружать оператор(), а то так ты получается даёшь пользователю поиграться с указателями matrix[]" Это ты что предлагаешь? matrix () (); matrix () [] или matrix [] ()? Конгениально, чё могу сказать "В терминологии не силён но помоему тут нарушается инкапсуляция или что-то типо того. Но точно что-то из принципов ООП нарушается"" тьфу "и вобще это всё жуткий быдлокод, весь обплевался пока читал " тебя никто об этом не просил, надо было- посмотрел бы только то, что я сказал посмотреть, сказано было- код сырой.
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
27.06.2011, 18:49 | 37 |
Хочется только немного слов сказать в защиту прокси-объектов. Никакие принципы ООП они при правильной реализации не нарушают. И иногда это единственный из удобных способов получить желаемое. В данном случае не единственный, но вполне возможный.
1
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
27.06.2011, 18:50 | 38 |
kravam, во-первых, я не давал повода так со мной разговаривать. Во-вторых, про строки (string или char*) речи не шло. И что, что класс шаблонный? Гляньте код по ссылке, сделайте классы Row и Matrix шаблонными и живите счастливо.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
27.06.2011, 18:51 [ТС] | 39 |
В данном случае, например.
И вообще скропайте перегрузку оператора [][] по-другому, предполагая, что элемент матрицы- элемент любого типа, тогда и будете базлать. Пока же всем вашим замечаниям в базарный день красная цена копейка.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||||||
27.06.2011, 18:55 | 40 | |||||
Да пожалуйста, что мне, жалко, что-ли?
0
|
27.06.2011, 18:55 | |