2 / 2 / 0
Регистрация: 09.04.2011
Сообщений: 110
1

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

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

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

p.s. вариант с указателем или отказом от деструктора не нужен
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.08.2012, 13:32
Ответы с готовыми решениями:

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

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

Вызов деструктора
Здравствуйте ,подскажите пожалуйста ,есть вот такой код ... При создании объекта MyClass в...

Вызов деструктора
Доброго вам времени суток. Проблема в том, что деструктор не выводит сообщение без этой строки....

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

Цитата Сообщение от Byurrer Посмотреть сообщение
и как от этого можно избавится?
Зачем?
0
2 / 2 / 0
Регистрация: 09.04.2011
Сообщений: 110
11.08.2012, 13:36  [ТС] 3
soon, поправил первый пост.
Мне это нужно чтобы я мог переменную var дальше использовать.
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.08.2012, 13:43 4
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  [ТС] 5
soon, прошу прощенья, я не правильно напсиал псевдокод, попарвил пост с этим кодом. Дело в том что вызод из функции WinMain не осуществялется до закрытия окна, а зациливается обаботка сообщений, и до этого зацикливания создается объект MyClass и после того как вызывается мной конструктор, почему то после него вызывается деструктор. Если объявить var как указатель и инициализировать соответсвующим образом (var = new MyClass()) то все в норме. И вот вопрос в том почему вызывается деструктор до выхода из функции, а точнее после вызова самого конструткора?
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.08.2012, 13:51 6
Byurrer, еще раз прочтите сообщение #4.
0
2 / 2 / 0
Регистрация: 09.04.2011
Сообщений: 110
11.08.2012, 13:53  [ТС] 7
soon, прочел, ситуация немного не та, в 4 посте осуществялется выход из функциии ессесно будет вызываться деструктор, а у меня не происходит выход из функциии и всеравно вызывается деструктор.
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.08.2012, 14:01 8
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
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
11.08.2012, 14:02 9
Byurrer, в строке
C++
1
var = MyClass(/*аргументы*/);
Создаётся временный безымянный объект класса MyClass, этот объект копируется в var, затем временный объект разрушается с вызовом деструктора. Для переменной var при этом деструктор здесь не вызывается. Как определялось, что деструктор вызывается когда не надо?
Если при разрушении временного объекта что-то нарушается в копии var, то это означает, что используется неправильный копирующий конструктор.
0
2 / 2 / 0
Регистрация: 09.04.2011
Сообщений: 110
11.08.2012, 14:06  [ТС] 10
Определял так, в конце конструктора МессиджБокс выдавал, и в деструткоре (ессесно с обозначением где конструткор, а где деструктор) и наблюдал эти два мессиджа друг за другом.
grizlik78, то есть по сути деструтор там не должен вызываться?
0
Модератор
Эксперт по электронике
8924 / 6691 / 920
Регистрация: 14.02.2011
Сообщений: 23,580
11.08.2012, 14:07 11
У тебя есть глобальный объект
Цитата Сообщение от 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  [ТС] 12
ValeryS, не дурень понимаю, но у меня написано по другому, я уже писал в предыдущих постах.
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
11.08.2012, 14:11 13
Цитата Сообщение от grizlik78 Посмотреть сообщение
то это означает, что используется неправильный копирующий конструктор.
Ах да, в том месте не конструктор, а оператор присваивания используется. Но сути это не меняет. И конструктор копирования и оператор присваивания должны обеспечивать сохранность копии после разрушения оригинала.

Цитата Сообщение от Byurrer Посмотреть сообщение
grizlik78, то есть по сути деструтор там не должен вызываться?
Деструктор временного объекта должен вызываться и вызывается. Деструктор var в этом месте не вызывается. Он будет вызываться только в конце программы, один раз.
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.08.2012, 14:12 14
Byurrer, ну так приведите пример вашего кода.
0
Модератор
Эксперт по электронике
8924 / 6691 / 920
Регистрация: 14.02.2011
Сообщений: 23,580
11.08.2012, 14:12 15
Цитата Сообщение от 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  [ТС] 16
Цитата Сообщение от grizlik78 Посмотреть сообщение
Деструктор временного объекта должен вызываться и вызывается. Деструктор var в этом месте не вызывается. Он будет вызываться только в конце программы, один раз.
все это я понимаю

soon,
C++
1
2
3
4
5
6
7
8
9
//разные инклюды
MyClass var;
 
int WinMain(...)
{
var = MyClass(/*аргументы*/);
//далее цикл проверки сообщений и прочего, короче функция не заканчивается
return 0;
}
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.08.2012, 14:15 17
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 18
нужно просто для своего класса перегрузить оператор присваивания и все будет отлично)
0
Неэпический
17885 / 10653 / 2059
Регистрация: 27.09.2012
Сообщений: 26,807
Записей в блоге: 1
22.04.2017, 18:24 19
Цитата Сообщение от Alex_4ndr Посмотреть сообщение
нужно просто для своего класса перегрузить оператор присваивания и все будет отлично
Думаете, за 4.5 года он не догадался?
0
0 / 0 / 0
Регистрация: 22.04.2017
Сообщений: 2
22.04.2017, 22:10 20
Цитата Сообщение от Croessmah Посмотреть сообщение
Думаете, за 4.5 года он не догадался?
хаххах) да я несмотрел когда это обсуждали) но тему то до сих пор просматривают, и мне из их диалога не сразу дошло, что нужно сделать, поэтому и написал))
0
22.04.2017, 22:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.04.2017, 22:10
Помогаю со студенческими работами здесь

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

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

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

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

Явный вызов деструктора
Есть класс Person, с полями string,string,long. Исходные данные хранятся в файле. Нужно сделать...

Вызов деструктора. MSVS и MinGW
Всем доброго дня. Вопрос в следующем. К примеру имеем код: //#include &quot;stdafx.h&quot; ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru