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

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

11.08.2012, 13:32. Показов 2766. Ответов 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
2383 / 1667 / 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,871
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
2383 / 1667 / 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,871
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
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru