Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Классы: копирование и присваивание. Часть 2.  (Прочитано 28265 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Sel
Злобный
Администратор

ru
Offline Offline

« : 22-08-2006 17:43 » 

Обсуждение статьи: «Классы: копирование и присваивание. Часть 2.»
« Последнее редактирование: 11-12-2007 17:32 от Алексей1153++ » Записан

Слово не воробей. Всё не воробей, кроме воробья.
ld
Новенький

bg
Offline Offline

« Ответ #1 : 30-01-2011 20:00 » 

Код:
35 // Конструктор копий с развернутым копированием
36 INT_ARRAY::INT_ARRAY(const INT_ARRAY& rhs)
37 {
38   delete [] data; //освобождаем память
39   max = rhs.max;
40   dummy = rhs.dummy;
41   data = new int [dummy]; //выделяем новый блок
42   for( unsigned int j = 0; j<duinmy; j++)
43     data[j] = rhs.data[j]; //копируем данные
44 }

Здравствуйте!
Спасибо за отлично написанную статью! Единственное, что непонятно, это строка 38 в конструкторе копий, предназначенная „для  освобождения  памяти, выделенной указателю вызывающего объекта”.
Ведь  до  вызова конструктора копий объект  еще не создан, какую память освобождаем?
Благодарю предварительно!
« Последнее редактирование: 30-01-2011 20:10 от Sla » Записан
PredatorAlpha
Помогающий

us
Offline Offline

« Ответ #2 : 25-03-2011 13:50 » 

+1  Тот вопрос, что задал предыдущий чел, возник и у меня. Этот момент желательно прояснить.
Я конечно догадываюсь, что это сделано для универсальности. Что если класс наследует какой-то класс-предок, то конструктор предка вызывается первым, и он может выделить память для data. Тогда надо освободить память, что выделил предок и перевыделить по новому.
Если так - то разве память, что выделилась объекту, зачищается нулями до вызова любых конструкторов?? Иначе ж можно ненароком освободить "чужую" память.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 25-03-2011 14:23 » 

"Какие все вууумные, аж противно." (с) Ага

А вас, челы вопрошающие, не смущает в первую очередь тот факт, что, например, указатель data не инициаллизирован? Те, как правильно заметил PredatorAlpha, будем освобождать память по адресу "мусор". Ага

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

В дебагере - да. Всё обнуляется.

Ну и зачем это всё сделано? Дело в том, доргие амигосы и мучачосы, что код в статьях и/или книгах не является 100% рабочим кодом, с логичным исполнением. Он служит исключительно для иллюстрации содержания, в данном случае для демонстрации смысловой идентичности оператора присваивания (в котором освобождение памяти не вызывает вопросов) и конструктора копирования. Пример показывает некие действия, которые можно/необходимо выполнить, чтобы подготовить объект к приёму данных из другого объекта. Конечно, правильно было бы в конструктор добавить сначала инициаллизацию объектов-членов, но это уже, как говорится, будем проходить на следующем уроке. Ага

Ну как-то так. Надеюсь прояснил.
« Последнее редактирование: 25-03-2011 14:27 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
PredatorAlpha
Помогающий

us
Offline Offline

« Ответ #4 : 25-03-2011 18:00 » 

Товарищ Джон, не надо пытаться выдать баг за фичу. В конструкторе копирования освобождение памяти по указателю (ещё не инициализированному) явный баг.
Единственный момент, где это имеет смысл я описал в предыдущем посте. Но здесь класс не наследует другой класс - т.е. это явный баг.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 25-03-2011 19:00 » 

Скорее всего это ошибка копипаста была - наверняка Михалыч сначала оператор = писал. В дебаггере, кстати, как раз неинициализированные не обнуляются Улыбаюсь А в релизе обнуляются, так что в релизе всё заработает.

Джон, закомментируй что ли ту строку Улыбаюсь А то народ на восстание подымется
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 28-03-2011 13:19 » 

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

Ещё раз, для тех кто с нами в танке, о каком баге или фиче идёт речь? Читаем внимательно: код в статье (как это обычно бывает в печатных изданиях) служит для иллюстрации содержания и не претендует на работоспособность. Рабочий код на прилагаемом диске. Sapienti sat.

Лёш, да наверняка. Сначала писался оператор копирования, а потом в конструктор скопипастил. Просто ну ковыряется в одном месте. Ну как же! Нашли величайшую ошибку! Три года никто не замечал. Надо же ткнуть умников в неё носом.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
PredatorAlpha
Помогающий

us
Offline Offline

« Ответ #7 : 28-03-2011 14:52 » 

Ещё раз, для тех кто с нами в танке, о каком баге или фиче идёт речь? Читаем внимательно: код в статье (как это обычно бывает в печатных изданиях) служит для иллюстрации содержания и не претендует на работоспособность. Рабочий код на прилагаемом диске. Sapienti sat.
То что демонстрационный код может не работать - это нормально. Плохо, когда в нём есть элементы некорректного программирования, чреватые плохим кодом.

Лёш, да наверняка. Сначала писался оператор копирования, а потом в конструктор скопипастил. Просто ну ковыряется в одном месте. Ну как же! Нашли величайшую ошибку! Три года никто не замечал. Надо же ткнуть умников в неё носом.
Извини, здесь не просто скопипастено. Прочитай текст, что идёт после кода:
Обратите внимание, что строки 38—43 конструктора копий и строки 50—55 операции присваивания идентичны: освобождается область памяти, адресуемая указателем data вызывающего объекта, затем выделяется новая область памяти и в нее копируются значения из памяти объекта аргумента.
Более того, эта идентичность потом развивается в Части 4 статьи, когда конструктор копирования реализуется через оператор присваивания.
Так что здесь не просто копипаст.
И я совсем не понимаю резкого тона. Если замечание по делу - то не надо отвечать в стиле "вот тут умников развелось!"
Записан
Михалыч
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 28-03-2011 17:43 » 

Извини, здесь не просто скопипастено. Прочитай текст, что идёт после кода:
Обратите внимание, что строки 38—43 конструктора копий и строки 50—55 операции присваивания идентичны: освобождается область памяти, адресуемая указателем data вызывающего объекта, затем выделяется новая область памяти и в нее копируются значения из памяти объекта аргумента.
Более того, эта идентичность потом развивается в Части 4 статьи, когда конструктор копирования реализуется через оператор присваивания.
Так что здесь не просто копипаст.
И я совсем не понимаю резкого тона. Если замечание по делу - то не надо отвечать в стиле "вот тут умников развелось!"
Господа Улыбаюсь Не ссорьтесь, пожалуйста...
Да, тут не просто скопипастено - тут злостно, со 100% точностью скопипастено из источника:
P.Kimmel
Using Borland C++ 5
Special Edition
перевод  BHV - С.Петербург 1997
Правда в оригинале, перед строками, которые наделали тут столько шума, была еще небольшая ремарка:
"Класс целочисленного массива написан исключительно в учебных целях и для практического применения интереса не представляет."
Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines