Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2011, 00:38   #1
Svetik001
Новичок
Джуниор
 
Регистрация: 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;
}
};
Svetik001 вне форума Ответить с цитированием
Старый 10.06.2011, 00:47   #2
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

ИМХО, ни в чем.
mMAg вне форума Ответить с цитированием
Старый 10.06.2011, 00:53   #3
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Ну, если будет использоваться встроенное банальное копирование всех полей, то double *values скопируется как указатель, т.е. в двух структурах будет два указателя на один и тот же массив. Одна структура удалится, удалится и массив, а во второй останется указатель на уже не существующий массив. Следствие: ошибки во время выполнения при попытке доступа или удаления второй структуры (если первая уже удалена).

Еще, если Вы просто создадите структуру и потом удалите ее, то тоже будет ошибка, так как удаляется массив, а указатель равен NULL. Поставьте что-то типа флага, что массив был создан, и только если флаг стоит удаляйте массив. - соврал, проверил.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 10.06.2011, 00:59   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Granus
не соврал, проверка перед удалением нужна. а флаг есть - это null
Код:
~MyStruct()
{
    if (values)
        delete [] values;
}
пс. к той же самой проблеме приведет отсутствие своего оператора присваивания
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:01   #5
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
проверка перед удалением нужна
Кхм. Опять gcc за меня все сделал, что ли? Проверил, delete [] (int *)0; ошибки не вызывает)
Updated:
codepad.org, известный своей прихотливостью, тоже нормально обработал. Видимо, все-таки то ли компилятор вставляет нужный код сам, то ли delete [] так работает.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 10.06.2011, 01:13   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 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.
pproger вне форума Ответить с цитированием
Старый 10.06.2011, 01:17   #7
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

И я не знал)
А ведь удобно-таки, можно и не проверять, значит
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 10.06.2011, 01:44   #8
Svetik001
Новичок
Джуниор
 
Регистрация: 10.06.2011
Сообщений: 2
По умолчанию

спасибо, выручили)
Svetik001 вне форума Ответить с цитированием
Старый 10.06.2011, 08:48   #9
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
Видимо, все-таки то ли компилятор вставляет нужный код сам, то ли delete [] так работает.
Я уже писал где-то. delete - перегруженный оператор.
В классическом С было три типа 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.
Smitt&Wesson вне форума Ответить с цитированием
Старый 10.06.2011, 09:50   #10
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Насчет delete к нулю учтем.
Кстати, по теме еще - если не сделать конструктор копирования/перегруженный operator=, то в ситуации типа
Код:
double *d1, *d2;
//...
MyStruct x, y;
x.SetValue(d1);   //Некая функция установки значений элементов x.Values
y = x;
x.SetValue(d2);
В y будет то же новое значение d2, что и в d1. И наоборот, если в y менять значения, в x они тоже изменятся.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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