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

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

11.08.2012, 13:32. Показов 2683. Ответов 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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru