|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
10.06.2011, 00:38 | #1 |
Новичок
Джуниор
Регистрация: 10.06.2011
Сообщений: 2
|
к чему приыедет отсутствие конструктора коирования
В чём опасность отсутствия конструктора копирования для приведённой ниже структуры:
struct MyStruct{ int x; double eps; double* values; MyStruct() { x = 0; eps = 0.0; values = NULL; return; } ~MyStruct() { delete [] values; return; } }; |
10.06.2011, 00:47 | #2 |
Форумчанин
Регистрация: 11.08.2009
Сообщений: 433
|
ИМХО, ни в чем.
|
10.06.2011, 00:53 | #3 |
С++
Форумчанин
Регистрация: 22.09.2008
Сообщений: 791
|
Ну, если будет использоваться встроенное банальное копирование всех полей, то double *values скопируется как указатель, т.е. в двух структурах будет два указателя на один и тот же массив. Одна структура удалится, удалится и массив, а во второй останется указатель на уже не существующий массив. Следствие: ошибки во время выполнения при попытке доступа или удаления второй структуры (если первая уже удалена).
Еще, если Вы просто создадите структуру и потом удалите ее, то тоже будет ошибка, так как удаляется массив, а указатель равен NULL. Поставьте что-то типа флага, что массив был создан, и только если флаг стоит удаляйте массив. - соврал, проверил.
Форматируйте код, будьте людьми.
|
10.06.2011, 00:59 | #4 |
C++ hater
СтарожилДжуниор
Регистрация: 19.07.2009
Сообщений: 3,333
|
2Granus
не соврал, проверка перед удалением нужна. а флаг есть - это null Код:
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance |
10.06.2011, 01:01 | #5 | |
С++
Форумчанин
Регистрация: 22.09.2008
Сообщений: 791
|
Цитата:
Updated: codepad.org, известный своей прихотливостью, тоже нормально обработал. Видимо, все-таки то ли компилятор вставляет нужный код сам, то ли delete [] так работает.
Форматируйте код, будьте людьми.
|
|
10.06.2011, 01:13 | #6 |
C++ hater
СтарожилДжуниор
Регистрация: 19.07.2009
Сообщений: 3,333
|
2Granus
хех, походу действительно delete (type *)0 не приводит к неопределенному поведению. не знал) точно, страутсруп пишет, применение delete к нулю не дает какого-либо эффекта. все таки полезно бумажные книги иметь
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance Последний раз редактировалось pproger; 10.06.2011 в 01:16. |
10.06.2011, 01:17 | #7 |
С++
Форумчанин
Регистрация: 22.09.2008
Сообщений: 791
|
И я не знал)
А ведь удобно-таки, можно и не проверять, значит
Форматируйте код, будьте людьми.
|
10.06.2011, 01:44 | #8 |
Новичок
Джуниор
Регистрация: 10.06.2011
Сообщений: 2
|
спасибо, выручили)
|
10.06.2011, 08:48 | #9 | |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,543
|
Цитата:
В классическом С было три типа new и два типа delete. new type new type(args) new type[size] Удалялись они так: delete pointer delete pointer delete [] pointer Допускалась запись и через разыменование типа к двум первым new. delete (type *)0 В связи с этим возникало много путаницы. В С++, за счёт расширенной политики полиморфизма, было реализовано следующее: для всех типов new - использовать оператор delete pointer. Так, что не парьтесь, все приведённые примеры будут работать одинаково. Никакой утечки памяти не будет.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder Последний раз редактировалось Smitt&Wesson; 10.06.2011 в 08:51. |
|
10.06.2011, 09:50 | #10 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
Насчет delete к нулю учтем.
Кстати, по теме еще - если не сделать конструктор копирования/перегруженный operator=, то в ситуации типа Код:
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
icq отсутствие ответов | divwond | Работа с сетью в Delphi | 1 | 15.02.2011 20:11 |
Отсутствие отрисовки на DC | Alex Cones | Win Api | 3 | 04.02.2011 11:59 |
Автоматическое преобразование на основе первого аргумента конструктора в вызов самого конструктора | jennya | Visual C++ | 8 | 03.10.2010 19:03 |
Отсутствие IP | GAGARIN-NEW | Работа с сетью в Delphi | 1 | 17.01.2008 17:56 |
Проверка на отсутствие данных в БД | Elena | БД в Delphi | 5 | 14.06.2007 16:10 |