Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
0 / 0 / 2
Регистрация: 04.07.2014
Сообщений: 93

Передача объекта по ссылке

26.07.2019, 09:12. Показов 6057. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В книге Шилдта есть задание:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <cstring>
#include <cstdlib>
 
using namespace std;
 
class strtype
{
    char *p;
public:
    strtype(char *s);
    ~strtype() { delete [] p; cout << "Destruction\n"; }
    char* get() { return p; }
};
 
strtype::strtype(char *s)
{
    int l = 0;
    l = strlen(s) + 1;
 
    p = new char [l];
    if(!p) {
        cout << "Ошибка выделения памяти\n";
        exit(1);
    }
 
    strcpy(p, s);
}
 
void show(strtype x)  // правильно &x, то бишь передача по ссылке
{
    char *s;
 
    s = x.get();
    cout << s << "\n";
}
 
int main()
{
    strtype a("one"), b("two");
 
    show(a);
    show(b);
 
    return 0;
}
В ответе сказано : В исходной программе объект передается в функцию show() по значению. Поэтому делается его копияю
Когда функция show() возвращает свое значение, копия удаляется и при этом вызывается деструктор копии.
Это приводит к освобождению памяти, на которую указывает указатель р, но освобожденная память все еще необходима аргументам функции show().
Что означает, - освобожденная память все еще необходима... Разве у каждого объекта не свой указатель p. Объясните, пожалуйста, подробнее, что происходит на самом деле, почему в таком случае программа завершается критически?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.07.2019, 09:12
Ответы с готовыми решениями:

Передача объекта по ссылке
Не работает передача константы по ссылке. Ошибка: &quot;error: passing ‘const std::allocator&lt;int&gt;’ as ‘this’ argument discards qualifiers &quot;...

Передача объекта структуры по ссылке
Здравствуйте. Нужно использовать передачу структуры по ссылке(или по указателю). Объясните пожалуйста как это делать и , если можно, как...

Передача объекта-наследника по r-value ссылке на родительский класс
Здоровеньки булы. Собственно, код: class x { protected: int a; public: x() {} x(int i) : a(i) {} x(const x&amp;...

45
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
28.07.2019, 22:34
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
Уж не потому ли, что точка зрения языка на этот вопрос поменялась, как вы считаете?
Я считаю, что строго говоря, у много стандартного языка, много точек зрения. И корректно можно лишь заметить как-то вроде: -"С точки зрения стандарта 11+ с ключом -pedantic-errors, это ошибка". С оговоркой, принимается. А вообще, всё это напоминает Ивана Ивановича с Иваном Никифоровичем, честное слово.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
28.07.2019, 22:42
Цитата Сообщение от IGPIGP Посмотреть сообщение
с ключом -pedantic-errors, это ошибка
Это всего лишь выбор конкретной реализации.
В самом стандарте никаких разграничений в том, что отдавать под подобный ключ, а что нет - не делается. Поэтому и говорить об этом я считаю не уместным. И именно поэтому я и не говорил.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.07.2019, 00:00
Цитата Сообщение от DrOffset Посмотреть сообщение
В самом стандарте никаких разграничений в том, что отдавать под подобный ключ, а что нет - не делается.
Но без реализации остаётся декларация. Пусть бы 1-2, а ведь нет. Может обвиним разрабов компилятора?
DrOffset, вообще подобные предостережения для "детей в подгузниках", вещь необходимая. Тут я серьёзен. Не всё программисты такие, но статистика достаточно неутешительна. Поэтому, если не написать, - "Не пихай в рот каку!", беда будет. И речь не о детях. Посмотрите изречения Торвальдса Линуса о ООП. А вот Джо Армстронг (один из создателей эрланг, умер этой весной) :
Думаю, проблемы с повторным использованием кода есть в объектно-ориентированных, а не в функциональных языках. Ведь объектно-ориентированные языки тянут за собой всю неявно окружающую их среду. Вы хотели только банан, а получили еще и гориллу, которая держит этот банан, и все джунгли впридачу
Как видим, нет проблем с интеллектом. Образность, юмор... И всё же прикладные математики - ребята не простые. Поэтому писать нужно, - убедили. Могу для всеобщего спокойствия проскандировать (с инициативной группой) - Ошибка-Ошибка-Ошибка.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.07.2019, 09:31
Цитата Сообщение от _stanislav Посмотреть сообщение
Валеронище, как то так работают умные указатели, туда копай
_stanislav, хорошая аналогия. Но я бы не согласился. И вот почему. Новичку нужно понять простые принципы захвата/освобождения. Идиома RAII вообще и принцип владения, в частности, необходимы для дальнейшего понимания более сложных моделей. Например модель разделяемого владения у смарт-пойнтеров с подсчётом ссылок. Без того пня о который споткнулся ТС нельзя двигаться дальше. Передача, сложных объектов (с нетривиальными конструкторами) по значению и её отличие от передачи ссылки, это шаг к пониманию передачи владения, в дальнейшем. Тут и смарт-пойнтеры и семантика перемещения и много чего ещё.
1
0 / 0 / 2
Регистрация: 04.07.2014
Сообщений: 93
29.07.2019, 09:35  [ТС]
Ребят, после всего вышеизложенного у меня мозг закипел и задымился )))
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.07.2019, 09:57
Цитата Сообщение от Валеронище Посмотреть сообщение
Ребят, после всего вышеизложенного у меня мозг закипел
У меня тоже. Но это обыденность. Валеронище, посмотрите работу конструктра копирования.
1. Передача по значению простых встроенных типов (это до конструкторов)
2. Конструктор - модель объекта.
3. Конструктор (не перемещающий - простой кк из любого новичковского курса) копии - средство поддержки семантики значения.
3.1 КК предоставляемый по умолчанию. Литеральные классы - потомки структур С.
И лишь потом, - случаи когда конструктора копии по умолчанию не достаточно (объекты с нетривиальным конструированием).
Тут не нужно торопиться иначе времени и сил уйдёт немеряно.
После этого механизм инициализации внутренних (локальных) объектов функции передаваемыми аргументами. Время жизни локальных объектов и деструкторы. Возможная гонка деструкторов в борьбе за нелокальный ресурс (блок динамической памяти, например) при неверном копировании аргумента.
Вот примерный план ответа на вопрос, как я его вижу. А теперь представьте себе сам ответ.
Почитайте и возвращайтесь с вопросами по отдельным пунктам, независимо от того, присутствуют ли они в перечислении или нет.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.07.2019, 09:57

Передача по ссылке
В учебнике написано, что можно использовать функцию с левой стороны операции присваивания, если она возвращает ссылку. Например, так: ...

Передача по ссылке
Задание №8 из книги &quot;Объектно-ориентированное программирование в С++&quot;, 4-е издание, Роберт Лафоре, 2004г. В некоторых компьютерных...

Передача по ссылке
Здравствуйте. 1.typedef struct { MATRIXX_LENTA&lt;double&gt;* MATR; //Ленточная матрица } DATA_LENTA, *PDATA_LENTA; DWORD WINAPI...

Передача по ссылке
С помощью функции rand() округлить значение double и передать его по ссылке.

Обращение к методам объекта по ссылке на объект
Метод объекта возвращает значение одного из параметров объекта. Необходимо обратиться к методу объекта по ссылке на этот объект. Когда...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
46
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №3)
Maks 15.11.2026
Обновленная версия предыдущей обработки. Изменения коснулись букв: Ъ, Ы, Ь, Э, отображения которых зависят от положения реквизита "Транслитерация имён". Изменено отображение буквы Й. Добавлена. . .
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru