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

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

07.02.2019, 05:04. Просмотров 812. Ответов 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, 09:18 21
Цитата Сообщение от 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;
}
Вывод:
Код
D::D()
C::C(const C &)
D::~D()
C::~C()

C::~C()
Объект C создаётся (вторая строка) до разрушения D d (третья строка).
0
Avaddon74
564 / 348 / 132
Регистрация: 15.09.2017
Сообщений: 1,230
07.02.2019, 09:33 22
Цитата Сообщение от 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
rat0r
256 / 149 / 19
Регистрация: 16.02.2018
Сообщений: 603
07.02.2019, 09:52 23
Цитата Сообщение от Avaddon74 Посмотреть сообщение
C() = default;
Ну замени на C() { cout << __FUNCSIG__ << endl; }, увидишь вызов дефолтного конструктора вместо конструктора копий.
Код
__cdecl D::D(void)
__cdecl C::C(void)
__cdecl D::~D(void)
__cdecl C::~C(void)
Где
Цитата Сообщение от Avaddon74 Посмотреть сообщение
после выхода из функции стек высвобождается, после этого создается объект C
?????
Вижу создание возвращаемого объекта до разрушения локальных ("высвобождения стека").
0
Avaddon74
564 / 348 / 132
Регистрация: 15.09.2017
Сообщений: 1,230
07.02.2019, 10:03 24
rat0r, Ну в стек то он его не кладет, он его создает только что бы передать значение, я про это и писал выше, вопрос же у ТС звучал про уничтожение, а не создание, т.е. ТС спрашивал почему С удаляется после D.
В общем, считаю далее разговор пустым

Добавлено через 3 минуты
Мы просто друг друга не поняли и дальше уходим в дебри
0
07.02.2019, 10:03
rat0r
256 / 149 / 19
Регистрация: 16.02.2018
Сообщений: 603
07.02.2019, 10:12 25
Цитата Сообщение от Avaddon74 Посмотреть сообщение
Мы просто друг друга не поняли
"стек высвобождается" можно понимать как-то иначе, чем как "уничтожаются локальные переменные в блоке с return statement"? Наличие стека и, при его наличии, его (не)использование из-за ABI/оптимизаций это детали реализации, от которых порядок создания возвращаемого объекта относительно разрушения локальных переменных зависеть не должен.
0
Jzx
-54 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 198
07.02.2019, 10:35  [ТС] 26
Avaddon74, рекомендую посмотреть, что пишет rat0r в других темах: [1], [2], [3]. Вывод по-моему очевиден: rat0r — это здешний полуграмотный тролль, дискутировать с ним не имеет смысла.
0
07.02.2019, 10:35
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2019, 10:35

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
Здравствуйте. В общем меня немного раздражает одна мелочь: когда создаёшь новую форму по...


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

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

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