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

Не понятный вызов деструктора

11.08.2012, 13:32. Показов 2613. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Ситуация такая, есть класс MyClass к примеру, и при таком коде:
C++
1
2
3
4
5
6
7
8
9
//разные инклюды
MyClass var;
 
int WinMain(...)
{
var = MyClass(/*аргументы*/);
//далее цикл проверки сообщений и прочего, короче функция не заканчивается
return 0;
}
сразу после строки инициализации (var = MyClass(/*аргументы*/) ; ) вызывается деструтор и объект уничтожается, хотя из кода видно что деструтор не вызываю. Подскажите пожалуйста почему это происходит и как от этого можно избавится? Заранее спасибо!

p.s. вариант с указателем или отказом от деструктора не нужен
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.08.2012, 13:32
Ответы с готовыми решениями:

Вызов деструктора
Вызывается ли деструктор объекта при завершении программы? а при аварийном завершении? А если снять процесс приложения диспетчером?

Вызов деструктора
Есть написанный мною код: #include <iostream> class Foo { private: int *key; public: Foo (const int a=0) { key = new int...

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

20
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.08.2012, 13:34
Цитата Сообщение от Byurrer Посмотреть сообщение
Подскажите пожалуйста почему это происходит
Выход из функции

Цитата Сообщение от Byurrer Посмотреть сообщение
и как от этого можно избавится?
Зачем?
0
2 / 2 / 0
Регистрация: 09.04.2011
Сообщений: 110
11.08.2012, 13:36  [ТС]
soon, поправил первый пост.
Мне это нужно чтобы я мог переменную var дальше использовать.
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.08.2012, 13:43
Byurrer, создается временный объект MyClass, который, в последствии, уничтожается.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
struct Foo
{
    Foo()
    {
        std::cout << " Foo() " << this << std::endl;
    }
 
    ~Foo()
    {
        std::cout << "~Foo() " << this << std::endl;
    }
};
 
Foo f;
 
int main()
{
    f = Foo();
    return 0;
}
0
2 / 2 / 0
Регистрация: 09.04.2011
Сообщений: 110
11.08.2012, 13:48  [ТС]
soon, прошу прощенья, я не правильно напсиал псевдокод, попарвил пост с этим кодом. Дело в том что вызод из функции WinMain не осуществялется до закрытия окна, а зациливается обаботка сообщений, и до этого зацикливания создается объект MyClass и после того как вызывается мной конструктор, почему то после него вызывается деструктор. Если объявить var как указатель и инициализировать соответсвующим образом (var = new MyClass()) то все в норме. И вот вопрос в том почему вызывается деструктор до выхода из функции, а точнее после вызова самого конструткора?
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.08.2012, 13:51
Byurrer, еще раз прочтите сообщение #4.
0
2 / 2 / 0
Регистрация: 09.04.2011
Сообщений: 110
11.08.2012, 13:53  [ТС]
soon, прочел, ситуация немного не та, в 4 посте осуществялется выход из функциии ессесно будет вызываться деструктор, а у меня не происходит выход из функциии и всеравно вызывается деструктор.
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.08.2012, 14:01
Byurrer, прочтите третий раз.
Цитата Сообщение от soon Посмотреть сообщение
создается временный объект MyClass
Цитата Сообщение от soon Посмотреть сообщение
который, в последствии, уничтожается.
Bash
1
2
3
4
5
soon@desktop:~/Src/C++/main$ ./main 
 Foo() 0x8049f90
 Foo() 0xbfc968ef
~Foo() 0xbfc968ef
~Foo() 0x8049f90
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
11.08.2012, 14:02
Byurrer, в строке
C++
1
var = MyClass(/*аргументы*/);
Создаётся временный безымянный объект класса MyClass, этот объект копируется в var, затем временный объект разрушается с вызовом деструктора. Для переменной var при этом деструктор здесь не вызывается. Как определялось, что деструктор вызывается когда не надо?
Если при разрушении временного объекта что-то нарушается в копии var, то это означает, что используется неправильный копирующий конструктор.
0
2 / 2 / 0
Регистрация: 09.04.2011
Сообщений: 110
11.08.2012, 14:06  [ТС]
Определял так, в конце конструктора МессиджБокс выдавал, и в деструткоре (ессесно с обозначением где конструткор, а где деструктор) и наблюдал эти два мессиджа друг за другом.
grizlik78, то есть по сути деструтор там не должен вызываться?
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
11.08.2012, 14:07
У тебя есть глобальный объект
Цитата Сообщение от Byurrer Посмотреть сообщение
MyClass var;
и в 6 строке ты его инициализируешь
Цитата Сообщение от Byurrer Посмотреть сообщение
var = MyClass(/*аргументы*/);
(надеюсь операция копирования реализована)
вот что происходит создается ВРЕМЕННЫЙ объект (безымянный)
Цитата Сообщение от Byurrer Посмотреть сообщение
MyClass(/*аргументы*/);
который вызывает конструктор с аргументами
и после этого только идет копирование с временного объекта в твой глобальный
на следующей строке временный объект уничтожается и вот вызывается его деструктор
если напишешь так


C++
1
2
3
int WinMain(...)
{
MyClass var (/*аргументы*/);
то var будет видна во всей WinMain
0
2 / 2 / 0
Регистрация: 09.04.2011
Сообщений: 110
11.08.2012, 14:09  [ТС]
ValeryS, не дурень понимаю, но у меня написано по другому, я уже писал в предыдущих постах.
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
11.08.2012, 14:11
Цитата Сообщение от grizlik78 Посмотреть сообщение
то это означает, что используется неправильный копирующий конструктор.
Ах да, в том месте не конструктор, а оператор присваивания используется. Но сути это не меняет. И конструктор копирования и оператор присваивания должны обеспечивать сохранность копии после разрушения оригинала.

Цитата Сообщение от Byurrer Посмотреть сообщение
grizlik78, то есть по сути деструтор там не должен вызываться?
Деструктор временного объекта должен вызываться и вызывается. Деструктор var в этом месте не вызывается. Он будет вызываться только в конце программы, один раз.
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.08.2012, 14:12
Byurrer, ну так приведите пример вашего кода.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
11.08.2012, 14:12
Цитата Сообщение от Byurrer Посмотреть сообщение
ValeryS, не дурень понимаю, но у меня написано по другому, я уже писал в предыдущих постах.
тебе 3 поста подряд пишут что вызывается деструктор временного объекта
примерно выходит так
.......
C++
1
2
3
4
{
 MyClass tmp (/*аргументы*/);
var =tmp;
}
так понятно чей деструктор вызывается?
0
2 / 2 / 0
Регистрация: 09.04.2011
Сообщений: 110
11.08.2012, 14:13  [ТС]
Цитата Сообщение от grizlik78 Посмотреть сообщение
Деструктор временного объекта должен вызываться и вызывается. Деструктор var в этом месте не вызывается. Он будет вызываться только в конце программы, один раз.
все это я понимаю

soon,
C++
1
2
3
4
5
6
7
8
9
//разные инклюды
MyClass var;
 
int WinMain(...)
{
var = MyClass(/*аргументы*/);
//далее цикл проверки сообщений и прочего, короче функция не заканчивается
return 0;
}
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.08.2012, 14:15
Byurrer, да боже-ж мой, вот код с бесконечным циклом
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
#include <iostream>
 
struct Foo
{
    Foo()
    {
        std::cout << " Foo() " << this << std::endl;
    }
 
    ~Foo()
    {
        std::cout << "~Foo() " << this << std::endl;
    }
};
 
Foo f;
 
int main()
{
    f = Foo();
    while(true)
        ;
    return 0;
}
На вывод смотрите.
0
0 / 0 / 0
Регистрация: 22.04.2017
Сообщений: 2
22.04.2017, 17:41
нужно просто для своего класса перегрузить оператор присваивания и все будет отлично)
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
22.04.2017, 18:24
Цитата Сообщение от Alex_4ndr Посмотреть сообщение
нужно просто для своего класса перегрузить оператор присваивания и все будет отлично
Думаете, за 4.5 года он не догадался?
0
0 / 0 / 0
Регистрация: 22.04.2017
Сообщений: 2
22.04.2017, 22:10
Цитата Сообщение от Croessmah Посмотреть сообщение
Думаете, за 4.5 года он не догадался?
хаххах) да я несмотрел когда это обсуждали) но тему то до сих пор просматривают, и мне из их диалога не сразу дошло, что нужно сделать, поэтому и написал))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.04.2017, 22:10
Помогаю со студенческими работами здесь

Вызов деструктора
Доброго вам времени суток. Проблема в том, что деструктор не выводит сообщение без этой строки. s1.~Shave(); И я не уверен, что так...

Вызов деструктора
При ручном вызове деструктора, освобождается ли память*

Повторный вызов деструктора
{ bar b; b.~bar(); } В данном примере деструктор bar вызовется дважды. Как у уже удаленного объекта может вызываться...

Двойной вызов деструктора
Здравствуйте, уважаемые. Вот столкнулся с такой проблемой... CharRow - это класс, который содержит указатель на строку... ...

Явный вызов деструктора
Добрый вечер всем! Я раньше читал статью о деструкторах, и там говорилось что можно явно вызвать деструктор. Статью я прочитал и забыл) И...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru