Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Jzx
-54 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 198
1

Порядок разрушения объектов

07.02.2019, 05:04. Просмотров 810. Ответов 25
Метки нет (Все метки)

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
#include <iostream>
using namespace std;
 
class C
{
    int c0;
    public:
    ~C() { cout << "Разрушение объекта класса C" << endl;}
}c;
 
class D
{
    int d0;
    public:
    ~D() { cout << "Разрушение локального объекта класса D" << endl;}
};
 
C func()
{
    D d;
    return c;
}
 
int main()
{
    func();
}
Программа печатает:
Разрушение локального объекта класса D
Разрушение объекта класса C
Разрушение объекта класса C
Почему разрушение объекта, возвращаемого функцией происходит позже, чем разрушение локальной переменной, объявленной в теле функции? Это такой стандартный порядок разрушения временных объектов, или порядок зависит от реализации?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2019, 05:04
Ответы с готовыми решениями:

Порядок вызова конструкторов при присваивании объектов одного класса
Имеется код ниже. Wein dres = rom; Где dres и rom объекты класса Wein. Класс Wein имеет...

Порядок отрицательных членов изменить на обратный, порядок неотрицательных сохранить
Задача (нужно все 3 пункта в 1 программе сделать) Прошу Помочь В условиях задания 3 а) порядок...

В программе реализовать возможность записи объектов в файл и чтения объектов из файла
Добрый день, помогите, пожалуйста! У меня есть программа: #include &lt;iostream&gt; #include...

Порядок объектов
Собственно сабж. Есть 3 объекта, один поверх другого, они перекрывают там, где ненужно (статус...

Порядок объектов на форме
Доброй ночи. У меня проблема с позицией timage и tbutton мне надо чтоб картинка перекрывала кнопку,...

25
rat0r
256 / 149 / 19
Регистрация: 16.02.2018
Сообщений: 603
07.02.2019, 07:24 2
Цитата Сообщение от Jzx Посмотреть сообщение
Почему разрушение объекта, возвращаемого функцией происходит позже, чем разрушение локальной переменной, объявленной в теле функции?
Потому что он создаётся на вызывающей стороне?
0
Jzx
-54 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 198
07.02.2019, 07:31  [ТС] 3
rat0r, какая разница, как он создаётся? В момент, когда он создаётся, локалы ещё не разрушены. Вопрос был о порядке разрушения временных объектов.
0
rat0r
256 / 149 / 19
Регистрация: 16.02.2018
Сообщений: 603
07.02.2019, 07:36 4
Цитата Сообщение от rat0r Посмотреть сообщение
Потому что он создаётся на вызывающей стороне?
Создаётся в возвращающей функции, конечно. Но находится на вызывающей стороне.
Цитата Сообщение от Jzx Посмотреть сообщение
Вопрос был о порядке разрушения временных объектов.
В конце вычисления полного выражения.
0
07.02.2019, 07:36
Jzx
-54 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 198
07.02.2019, 07:43  [ТС] 5
Цитата Сообщение от rat0r Посмотреть сообщение
Создаётся в возвращающей функции, конечно. Но находится на вызывающей стороне.
Я бы предпочёл цитату из стандарта языка, в которой вы это вычитали.
Цитата Сообщение от rat0r Посмотреть сообщение
В конце вычисления полного выражения.
Хранятся ли локалы до конца вычисления полного выражения?
0
Avaddon74
564 / 348 / 132
Регистрация: 15.09.2017
Сообщений: 1,230
07.02.2019, 07:52 6
Цитата Сообщение от Jzx Посмотреть сообщение
Почему разрушение объекта, возвращаемого функцией происходит позже, чем разрушение локальной переменной
Локальная переменная хранится в стеке функции, после выхода из функции стек высвобождается, после этого создается объект C делается его копия (т.к. возврат по значению), оригинал уничтожается, копия уничтожается при выходе из функции main
1
rat0r
256 / 149 / 19
Регистрация: 16.02.2018
Сообщений: 603
07.02.2019, 07:56 7
Цитата Сообщение от Jzx Посмотреть сообщение
Я бы предпочёл цитату из стандарта языка, в которой вы это вычитали.
Их много тут и там.
https://timsong-cpp.github.io/cppwp/...lue_expression
https://timsong-cpp.github.io/cppwp/n4659/conv.rval
https://timsong-cpp.github.io/cppwp/n4659/basic.lval#def:result_object
https://timsong-cpp.github.io/cppwp/n4659/stmt.return
https://timsong-cpp.github.io/cppwp/n4659/expr.call
Цитата Сообщение от Jzx Посмотреть сообщение
Хранятся ли локалы до конца вычисления полного выражения?
Не должны.

Добавлено через 3 минуты
Цитата Сообщение от Avaddon74 Посмотреть сообщение
после выхода из функции стек высвобождается, после этого создается объект C делается его копия
result object инициализируется до разрушения локальных переменных.
0
Jzx
-54 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 198
07.02.2019, 07:57  [ТС] 8
rat0r, что непонятного в слове "цитата"?
0
rat0r
256 / 149 / 19
Регистрация: 16.02.2018
Сообщений: 603
07.02.2019, 08:07 9
Цитата Сообщение от Jzx Посмотреть сообщение
что непонятного в слове "цитата"?
Буква "ц".
0
Jzx
-54 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 198
07.02.2019, 08:10  [ТС] 10
rat0r, вас следовало добавить в игнор-лист сразу. Когда я открыл ваш профиль и посмотрел участие в других темах, мне сразу всё стало ясно. Но лучше поздно, чем никогда. Игнор.
0
Avaddon74
564 / 348 / 132
Регистрация: 15.09.2017
Сообщений: 1,230
07.02.2019, 08:12 11
Цитата Сообщение от Jzx Посмотреть сообщение
}c;
Кстати, на обратил внимания на 9 строчку, тут c создается в глобальной области, она и уничтожается последней
Цитата Сообщение от rat0r Посмотреть сообщение
result object инициализируется до разрушения локальных переменных.
это если так:
C++
1
2
3
4
5
6
C func()
{
    D d;
    C c;
    return c;
}
а когда так:
C++
1
2
3
4
5
C func()
{
    D d;
    return C();
}
то он сначала удалит D а потом создаст C
0
rat0r
256 / 149 / 19
Регистрация: 16.02.2018
Сообщений: 603
07.02.2019, 08:14 12
Цитата Сообщение от Avaddon74 Посмотреть сообщение
а когда так:
то он сначала удалит D а потом создаст C
...
Цитата Сообщение от https://timsong-cpp.github.io/cppwp/n4659/stmt.return#3
The copy-initialization of the result of the call is sequenced before the destruction of temporaries at the end of the full-expression established by the operand of the return statement, which, in turn, is sequenced before the destruction of local variables ([stmt.jump]) of the block enclosing the return statement.
0
Avaddon74
564 / 348 / 132
Регистрация: 15.09.2017
Сообщений: 1,230
07.02.2019, 08:17 13
rat0r, Во всяком случае, у меня, вот втором случае D удаляется раньше, а значит C он в стек не кладет, возможно компилятор перестроил код и посчитал поступить иначе
0
Jzx
-54 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 198
07.02.2019, 08:29  [ТС] 14
Цитата Сообщение от Avaddon74 Посмотреть сообщение
Локальная переменная хранится в стеке функции, после выхода из функции стек высвобождается
Спасибо. Я почему-то никак не мог вспомнить правило: "Переменные с автоматическим классом памяти, объявленные в некотором блоке, разрушаются при выходе из этого блока." В момент вычисления значения выражения func() управление уже должно быть передано за пределы блока (тела функции). Поэтому память, которую занимали локалы, должна быть уже к этому моменту освобождена.
0
Avaddon74
564 / 348 / 132
Регистрация: 15.09.2017
Сообщений: 1,230
07.02.2019, 08:46 15
Цитата Сообщение от Jzx Посмотреть сообщение
Спасибо. Я почему-то никак не мог вспомнить правило
Если хотите получше ознакомиться как всё работает внутри, советую ознакомиться, хотя бы поверхностно, с ассемблерным кодом, и тогда многие вопросы отпадут, почитайте про архитектуру процессоров.
0
rat0r
256 / 149 / 19
Регистрация: 16.02.2018
Сообщений: 603
07.02.2019, 08:52 16
Цитата Сообщение от Avaddon74 Посмотреть сообщение
Во всяком случае, у меня, вот втором случае D удаляется раньше
Раньше чего?
0
Avaddon74
564 / 348 / 132
Регистрация: 15.09.2017
Сообщений: 1,230
07.02.2019, 09:05 17
Цитата Сообщение от rat0r Посмотреть сообщение
Раньше чего?
Раньше С
а в первом случае сначала удаляется C потом D
0
rat0r
256 / 149 / 19
Регистрация: 16.02.2018
Сообщений: 603
07.02.2019, 09:07 18
Avaddon74, удаляется D раньше, но изначально было сказано не об удалении, а о создании
Цитата Сообщение от Avaddon74 Посмотреть сообщение
после выхода из функции стек высвобождается, после этого создается объект C
0
WhiteP
611 / 209 / 32
Регистрация: 20.11.2012
Сообщений: 436
Завершенные тесты: 1
07.02.2019, 09:11 19
Цитата Сообщение от Avaddon74 Посмотреть сообщение
rat0r, Во всяком случае, у меня, вот втором случае D удаляется раньше, а значит C он в стек не кладет, возможно компилятор перестроил код и посчитал поступить иначе
С оптимизациями в релиз-версии компилятора VS - код из деструктора D (cout) инлайнится в тело func и вызывается перед возвратом. Перед этим значение int c0 из статик объекта c копируется в регистр eax.
0
Avaddon74
564 / 348 / 132
Регистрация: 15.09.2017
Сообщений: 1,230
07.02.2019, 09:12 20
Цитата Сообщение от rat0r Посмотреть сообщение
но изначально было сказано не об удалении, а о создании
Вот вопрос ТСа
Цитата Сообщение от Jzx Посмотреть сообщение
Почему разрушение объекта...
0
07.02.2019, 09:12
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2019, 09:12

Jaxb порядок создания объектов
Всем привет. В таком примере: &lt;root&gt; &lt;a&gt;&lt;/a&gt; &lt;b&gt;&lt;/b&gt; &lt;a&gt;&lt;/a&gt; ...

Изменить порядок элементов в инспекторе объектов
Располагаю на форме Panel, потом на панель кладу сначала 3 надписи, а потом 3 поля ввода. Потом...

Изменить порядок добавления вкладок объектов в среде VS
Здравствуйте. В общем меня немного раздражает одна мелочь: когда создаёшь новую форму по...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.