|
0 / 0 / 2
Регистрация: 04.07.2014
Сообщений: 93
|
||||||
Передача объекта по ссылке26.07.2019, 09:12. Показов 5547. Ответов 45
Метки нет (Все метки)
В книге Шилдта есть задание:
Когда функция show() возвращает свое значение, копия удаляется и при этом вызывается деструктор копии. Это приводит к освобождению памяти, на которую указывает указатель р, но освобожденная память все еще необходима аргументам функции show(). Что означает, - освобожденная память все еще необходима... Разве у каждого объекта не свой указатель p. Объясните, пожалуйста, подробнее, что происходит на самом деле, почему в таком случае программа завершается критически?
0
|
||||||
| 26.07.2019, 09:12 | |
|
Ответы с готовыми решениями:
45
Передача объекта структуры по ссылке Передача объекта-наследника по r-value ссылке на родительский класс |
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 26.07.2019, 09:23 | ||
|
При выходе из функции один объект удаляется и удаляет в деструкторе это строку delete [] p. Однако, второй объект этого никак не знает и его p указывает на удалённую строку. При обращении к ней или попытке удаления возникает ошибка.
1
|
||
|
0 / 0 / 2
Регистрация: 04.07.2014
Сообщений: 93
|
|
| 26.07.2019, 12:25 [ТС] | |
|
Почему при вызове show получается два объекта?
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||
| 26.07.2019, 12:29 | |||
|
1
|
|||
|
0 / 0 / 2
Регистрация: 04.07.2014
Сообщений: 93
|
||||||
| 26.07.2019, 12:34 [ТС] | ||||||
|
Хорошо, это понятно, но если убрать второй объект, то все работает, хотя ты так же передаешь объект по значению
0
|
||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 26.07.2019, 12:46 | ||
|
Добавлено через 3 минуты Ну да, в релизе почему то-не падает. Но это не важно, скорее всего случайно. По-любому так нельзя.
1
|
||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||
| 26.07.2019, 13:24 | ||
|
1
|
||
|
0 / 0 / 2
Регистрация: 04.07.2014
Сообщений: 93
|
|
| 26.07.2019, 14:20 [ТС] | |
|
Сейчас вызвал ее в цикле сто раз, ни разу не упала ��
Добавлено через 1 минуту Но правда вместо one, после первого раза, потом выводится черточка, так как память удалилась Добавлено через 1 минуту А когда два разных объекта, - сразу падает Добавлено через 6 минут И все же непонятна фраза "Это приводит к освобождению памяти, на которую указывает указатель р, но освобожденная память все еще необходима аргументам функции show()". Каким образом она необходима аргументам, функция ведь завершилась?
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||
| 26.07.2019, 14:24 | |||
|
Добавлено через 2 минуты
1
|
|||
|
0 / 0 / 2
Регистрация: 04.07.2014
Сообщений: 93
|
|
| 26.07.2019, 14:34 [ТС] | |
|
То есть по значению вообще не рекомендуется передавать объекты?
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||||||||||||
| 26.07.2019, 14:39 | ||||||||||||
|
И делать для таких объектов, как у тебя, конструктор/оператор копирования. Добавлено через 1 минуту Здесь же нужно сделать
1
|
||||||||||||
|
330 / 145 / 56
Регистрация: 17.10.2015
Сообщений: 580
|
|||
| 26.07.2019, 14:42 | |||
|
0
|
|||
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
||
| 27.07.2019, 00:37 | ||
![]() У литерала статический класс хранения, он живет все время выполнения программы. Ошибка будет из-за того, что литерал - это константный массив, а инициализируется указатель на неконстанту.
1
|
||
|
"C with Classes"
|
|
| 27.07.2019, 00:50 | |
|
я кстати думал, почему мой любимй Стауструп так сказал.
0
|
|
|
Комп_Оратор)
|
||
| 27.07.2019, 02:07 | ||
![]() Добавлено через 10 минут Валеронище, смысл действа в том, что при передаче по значению, конструктор копии запускается неявно. Поскольку вы не определили свой конструктор копии, то вызов функции использует конструктор копии предоставляемый по умолчанию. Этот кк (ка-ка cout<<"\nctor\n"; и cout<<"\ndtor\n"; и посмотереть разные варианты. Повозвращать созданные в функции значения можно тоже.
0
|
||
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
|
| 27.07.2019, 11:17 | |
|
0
|
|
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
||
| 27.07.2019, 12:02 | ||
|
Компиляторы могут делать любые допущения, но это не меняет факта
0
|
||
|
Комп_Оратор)
|
|||
| 27.07.2019, 13:04 | |||
0
|
|||
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
||||
| 27.07.2019, 13:37 | ||||
|
Не смотря на то, что это информативная часть, а не нормативная, информация опирается на нормативные положения, которые касаются неявного снятия константности в общем случае. В C++03 об этом отдельно упоминалось, хотя и (говоря вашим языком) порицалось:
0
|
||||
| 27.07.2019, 13:37 | |
|
Помогаю со студенческими работами здесь
20
Передача по ссылке
Обращение к методам объекта по ссылке на объект Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|