![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#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; } }; |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 11.08.2009
Сообщений: 433
|
![]()
ИМХО, ни в чем.
|
![]() |
![]() |
![]() |
#3 |
С++
Форумчанин
Регистрация: 22.09.2008
Сообщений: 791
|
![]()
Ну, если будет использоваться встроенное банальное копирование всех полей, то double *values скопируется как указатель, т.е. в двух структурах будет два указателя на один и тот же массив. Одна структура удалится, удалится и массив, а во второй останется указатель на уже не существующий массив. Следствие: ошибки во время выполнения при попытке доступа или удаления второй структуры (если первая уже удалена).
Еще, если Вы просто создадите структуру и потом удалите ее, то тоже будет ошибка, так как удаляется массив, а указатель равен NULL. Поставьте что-то типа флага, что массив был создан, и только если флаг стоит удаляйте массив. - соврал, проверил.
Форматируйте код, будьте людьми.
|
![]() |
![]() |
![]() |
#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 |
![]() |
![]() |
![]() |
#5 | |
С++
Форумчанин
Регистрация: 22.09.2008
Сообщений: 791
|
![]() Цитата:
Updated: codepad.org, известный своей прихотливостью, тоже нормально обработал. Видимо, все-таки то ли компилятор вставляет нужный код сам, то ли delete [] так работает.
Форматируйте код, будьте людьми.
|
|
![]() |
![]() |
![]() |
#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. |
![]() |
![]() |
![]() |
#7 |
С++
Форумчанин
Регистрация: 22.09.2008
Сообщений: 791
|
![]()
И я не знал)
А ведь удобно-таки, можно и не проверять, значит
Форматируйте код, будьте людьми.
|
![]() |
![]() |
![]() |
#8 |
Новичок
Джуниор
Регистрация: 10.06.2011
Сообщений: 2
|
![]()
спасибо, выручили)
|
![]() |
![]() |
![]() |
#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 |
Старожил
Регистрация: 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 |