| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Вызов деструктора после |
| Автор: Rickert 20.4.2009, 10:46 | ||||||
Есть класс:
От него наследую:
Описание второго:
Создаю два объекта aPacketIni и присваиваю один другому. Сам процесс присваивания проходит правильно, но после этого вызывается деструктор aPacketIni объекта, которому присваивали значение. Почему? |
| Автор: azesmcar 20.4.2009, 11:01 |
| Rickert Видимо потому что оператор присваивания возвращает обьект по значеню а не по ссылке |
| Автор: Rickert 20.4.2009, 11:06 |
| Да, так и есть. Тогда я не понимаю почему у меня второй класс работает нормально. Пошёл искать ошибку. Спасибо! solved |
| Автор: pompei 20.4.2009, 11:06 |
| Как создаёте: в стеке или в куче? |
| Автор: math64 20.4.2009, 11:38 |
| А рекурсии почему не возникает? По return (*this); объект должен скопироваться в место, предоставленное вызвавшей функцией для помещения результата, а для этого должен быть вызван оператор копирования. |
| Автор: math64 20.4.2009, 13:36 |
| Понятно. По return (*this); создаётся новый объект с помощью копирующего конструктора (а не оператора копирования), поскольку было выделено место для объекта, а объект ещё был не создан. Поскольку копирующий конструктор не определён, компилятор создаст его сам (причём неправильный - скопруется указатель data, а не будет выделятся новая память). Таким образом, у двух объектов будут одинаковые data. После выхода из оперетора копирования, поскольку результат операции никуда не присваивается и больше не нужен, вызывается деструктор и data удаляется. В скопированном объекте data указывает на удалённую память. Вывод: 1. operator=() должен возвращать ссылку или ничего, его агрумент тоже должен быть ссылкой (но возможны исключения) 2. Вместе с operator=() нужно создавать копирующий конструктор, чтобы они работали согласованно. |
| Автор: zim22 20.4.2009, 13:48 | ||
и деструктор тоже нужно свой определить. |
| Автор: azesmcar 20.4.2009, 14:45 |
| math64 1. Для класса автоматически буду сгенерированы (если они нужны и если они не написаны пользователем)
3. Если вам понадобилось явно написать копирующий конструктор или оператор присваивания - скорее всего нужно написать все 4. Вот в принципе базовые правила для так называемой "Большой четверки" |
| Автор: zim22 20.4.2009, 14:53 | ||||
а я знаю большую тройку. и дефолт конструктор в ней не обязателен.
|
| Автор: azesmcar 20.4.2009, 14:56 | ||
А где я писал что обязателен? |
| Автор: zim22 20.4.2009, 14:58 |
здесь. не прямо, но косвенно |
| Автор: azesmcar 20.4.2009, 14:59 | ||||
zim22
разницы нет? |
| Автор: zim22 20.4.2009, 15:01 |
| azesmcar, любите же вы придираться к словам |
| Автор: azesmcar 20.4.2009, 15:05 | ||
Я? Конструктор скорее всего понадобится потому что если в классе есть что копировать или присваивать (причем не тривиально а нужен для этого свой оператор/копирующий конструктор) то скорее всего нужен конструктор чтобы его проинициализировать. Это может и не быть дефолт конструктор, но какой-то понадобится. Это типа рекомендации над чем надо задумываться когда пишешь и вовсе не означают что они обязательны. |
| Автор: Rickert 21.4.2009, 02:37 |
| Всё верно. |