Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204

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

07.02.2019, 05:04. Показов 3644. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.02.2019, 05:04
Ответы с готовыми решениями:

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

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

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

25
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
07.02.2019, 09:18
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Avaddon74 Посмотреть сообщение
Вот вопрос ТСа
Вот утвеждение Avaddon74
Цитата Сообщение от Avaddon74 Посмотреть сообщение
после выхода из функции стек высвобождается, после этого создается объект C
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;
 
struct C
{
    C() = default;
    C(const C&) { cout << __PRETTY_FUNCTION__ << endl; }
    ~C() { cout << __PRETTY_FUNCTION__ << endl; }
} c;
 
struct D
{
    D()  { cout << __PRETTY_FUNCTION__ << endl; }
    ~D() { cout << __PRETTY_FUNCTION__ << endl; }
};
 
C func()
{
    D d;
    return c;
}
 
int main()
{
    func();
    cout << endl;
}
Вывод:
Code
1
2
3
4
5
6
D::D()
C::C(const C &)
D::~D()
C::~C()
 
C::~C()
Объект C создаётся (вторая строка) до разрушения D d (третья строка).
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
07.02.2019, 09:33
Цитата Сообщение от WhiteP Посмотреть сообщение
код из деструктора D (cout) инлайнится в тело func и вызывается перед возвратом. Перед этим значение int c0 из статик объекта c копируется в регистр eax.
Я приблизительно так и представлял, т.е. значение С он в стек и не кладет

Добавлено через 12 минут
rat0r, А как вам это?
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
#include <iostream>
using namespace std;
 
struct C
{
    C() = default;
    C(const C&) { cout << __FUNCSIG__ << endl; }
    ~C() { cout << __FUNCSIG__ << endl; }
    int c0 = 0;
};
 
struct D
{
    D() { cout << __FUNCSIG__ << endl; }
    ~D() { cout << __FUNCSIG__ << endl; }
};
 
C func()
{
    D d;
    return C();
}
 
int main()
{
    func();
    cout << endl;
}
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
07.02.2019, 09:52
Цитата Сообщение от Avaddon74 Посмотреть сообщение
C() = default;
Ну замени на C() { cout << __FUNCSIG__ << endl; }, увидишь вызов дефолтного конструктора вместо конструктора копий.
Code
1
2
3
4
__cdecl D::D(void)
__cdecl C::C(void)
__cdecl D::~D(void)
__cdecl C::~C(void)
Где
Цитата Сообщение от Avaddon74 Посмотреть сообщение
после выхода из функции стек высвобождается, после этого создается объект C
?????
Вижу создание возвращаемого объекта до разрушения локальных ("высвобождения стека").
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
07.02.2019, 10:03
rat0r, Ну в стек то он его не кладет, он его создает только что бы передать значение, я про это и писал выше, вопрос же у ТС звучал про уничтожение, а не создание, т.е. ТС спрашивал почему С удаляется после D.
В общем, считаю далее разговор пустым

Добавлено через 3 минуты
Мы просто друг друга не поняли и дальше уходим в дебри
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
07.02.2019, 10:12
Цитата Сообщение от Avaddon74 Посмотреть сообщение
Мы просто друг друга не поняли
"стек высвобождается" можно понимать как-то иначе, чем как "уничтожаются локальные переменные в блоке с return statement"? Наличие стека и, при его наличии, его (не)использование из-за ABI/оптимизаций это детали реализации, от которых порядок создания возвращаемого объекта относительно разрушения локальных переменных зависеть не должен.
0
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204
07.02.2019, 10:35  [ТС]
Avaddon74, рекомендую посмотреть, что пишет rat0r в других темах: [1], [2], [3]. Вывод по-моему очевиден: rat0r — это здешний полуграмотный тролль, дискутировать с ним не имеет смысла.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.02.2019, 10:35

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

Порядок объектов на форме
Доброй ночи. У меня проблема с позицией timage и tbutton мне надо чтоб картинка перекрывала кнопку, нажимал control=&gt;bring front у...

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

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

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


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru