|
0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 20
|
||||||
Компилятор игнорирует явный конструктор копирования08.04.2016, 10:25. Показов 3974. Ответов 36
Метки нет (Все метки)
Уже в который раз возникают проблемы с конструкторами класса и вот очередная из них. Насколько я понял, компилятор игнорирует явно написанный конструктор копирования и использует тот, что по умолчанию, в итоге в двух разных объектах поля last_name имеют один и тот же адрес, что вызывает ошибку при выполнении деструктора, который высвобождает динамическую память. Как заставить компилятор использовать мой конструктор копирования и если проблема не в этом, тогда что делать?
0
|
||||||
| 08.04.2016, 10:25 | |
|
Ответы с готовыми решениями:
36
Явный конструктор копирования в c++ Объясните, зачем в коде нужен явный конструктор копирования Явный и неявный конструктор |
|
|
||
| 08.04.2016, 11:09 | ||
|
Добавлено через 3 минуты Не по теме: Croessmah, есть 2003 стандарт? На iso сайте только последний нашел. Интересно, что там пишут по этому поводу.
0
|
||
|
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
|
||
| 08.04.2016, 11:13 | ||
|
Pink_Pank, ну говорю же лично для меня, такой new новое, буду знать
![]() Добавлено через 3 минуты Pink_Pank, про Placement new обязательно почитаю Не по теме: Тема оказалась полезнее для меня чем для ТС`а :)
0
|
||
|
47 / 31 / 21
Регистрация: 04.04.2016
Сообщений: 209
|
|
| 08.04.2016, 11:15 | |
|
Деструктору имеет смысл справляться только с освобождением выделенной памяти.
А остальное - проблемы компилятора. И то, с использованием умных указателей, и проблема возврата памяти плавно перелазит на плечи компиля.
0
|
|
|
|
|
| 08.04.2016, 12:00 | |
|
2
|
|
| 08.04.2016, 12:05 | |
|
0
|
|
|
|
||
| 08.04.2016, 12:11 | ||
|
1
|
||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
| 08.04.2016, 12:42 | |
|
не успел цитату с стандарта 12.8.2 выложили уже)
0
|
|
|
Ушел с форума
|
||
| 08.04.2016, 13:11 | ||
|
Сдается мне, что конструктор копирования здесь вообще не при чем.
1
|
||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
|||
| 08.04.2016, 13:28 | |||
|
Добавлено через 11 минут Но можно распределить память (например через operator new или malloc), а затем создать в ней объект с помощью placement new. Реализация стандартных контейнеров (в частности vector) пользуется именно этим. По поводу инициализации элементов массивов см. пример. По поводу подводных камней при использовании placement new для присваивания объектов см. эту тему.
2
|
|||
|
0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 20
|
||
| 08.04.2016, 17:47 [ТС] | ||
|
obivan, Я так и не понял что мне конкретно исправить)
Добавлено через 4 минуты Добавлено через 11 минут DrOffset, то есть, чтобы пользоваться конструктором копирования, мне нужно иметь "пустой" объект? или я неправильно понимаю? Как мне именно написать?
0
|
||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
|
|||||||||
| 08.04.2016, 18:07 | |||||||||
Сообщение было отмечено Siarhey как решение
РешениеКонструктор - это всегда "самый первый" метод объекта, работающий на регионе памяти. До него никого не было. Если у вас в конструкторе есть какая-то завязка на исходное содержимое инициализируемой памяти - значит вы что-то делаете неправильно. Еще раз: конструктор всегда считает, что вызывается на сырую память. Без вариантов. Никакого удаления предыдущих данных в конструкторе нет и быть не может. В момент начала работы конструктора память содержит мусор и анализировать этот мусор никакого смысла нет. Чтобы в такой ситуации легально применить placement new, надо будет сначала вручную деструктировать эти объекты вызовом деструктора. Либо исходный массив надо было выделять как буфер из char, и тогда можно было бы поверх пройтись placement new. Но ни в коем случае не идти по уже сконструированным объектам через placement new.В любом случае, еще раз: любая попытка анализировать предыдущее состояние объекта в конструкторе - всегда ошибка. "Предыдущего состояния" у конструируемого объекта нет. Объект всегда конструируется в сырой неинициализированной памяти. Конструктором копирования класса C называется конструктор, у которого первый параметр имеет тип C &, const C &, volatile C & или const volatile C & и либо больше нет параметров вообще, либо все остальные параметры имеют аргументы по умолчанию.[/quote]
1
|
|||||||||
|
0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 20
|
||||||
| 08.04.2016, 18:08 [ТС] | ||||||
|
Kastaneda,крч вот мэйн
(операции присваивания и вывода на экран я перегрузил, просто стёр в заголовочном для читабельности, но я уверен, там всё правильно)
0
|
||||||
|
|
|||
| 08.04.2016, 18:10 | |||
Сообщение было отмечено Siarhey как решение
РешениеДобавлено через 1 минуту Вот же оно
1
|
|||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
|
||
| 08.04.2016, 18:13 | ||
|
1
|
||
|
0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 20
|
||||||
| 08.04.2016, 18:17 [ТС] | ||||||
|
Kastaneda, всё, вроде бы понял, спасибо)
Добавлено через 2 минуты TheCalligrapher, а вот так будет?
0
|
||||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
|
|||||||
| 08.04.2016, 18:18 | |||||||
1
|
|||||||
| 08.04.2016, 18:18 | |
|
Как использовать явный конструктор родительского класса? Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования Конструктор класса, конструктор копирования запускается не тот который нужен Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику Компилятор игнорирует функции cin, if, for Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов.
Логика кажется понятной:
1. Находим ключевые слова.
2. Добавляем их на. . .
|
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302
Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
|