|
0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 20
|
||||||
Компилятор игнорирует явный конструктор копирования08.04.2016, 10:25. Показов 3936. Ответов 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
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||
| 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,306
|
|||||||||
| 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,306
|
||
| 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,306
|
|||||||
| 08.04.2016, 18:18 | |||||||
1
|
|||||||
| 08.04.2016, 18:18 | |
|
Как использовать явный конструктор родительского класса? Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования Конструктор класса, конструктор копирования запускается не тот который нужен Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику Компилятор игнорирует функции cin, if, for Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|