Форум программистов, компьютерный форум CyberForum.ru

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

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

p.s. вариант с указателем или отказом от деструктора не нужен
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2012, 13:32     Не понятный вызов деструктора
Посмотрите здесь:

вызов деструктора функцией-членом C++
Вызов деструктора C++
C++ Явный вызов деструктора
C++ Вызов деструктора
C++ Повторный вызов деструктора
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.08.2012, 13:34     Не понятный вызов деструктора #2
Цитата Сообщение от Byurrer Посмотреть сообщение
Подскажите пожалуйста почему это происходит
Выход из функции

Цитата Сообщение от Byurrer Посмотреть сообщение
и как от этого можно избавится?
Зачем?
Byurrer
2 / 2 / 0
Регистрация: 09.04.2011
Сообщений: 110
11.08.2012, 13:36  [ТС]     Не понятный вызов деструктора #3
soon, поправил первый пост.
Мне это нужно чтобы я мог переменную var дальше использовать.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 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;
}
Byurrer
2 / 2 / 0
Регистрация: 09.04.2011
Сообщений: 110
11.08.2012, 13:48  [ТС]     Не понятный вызов деструктора #5
soon, прошу прощенья, я не правильно напсиал псевдокод, попарвил пост с этим кодом. Дело в том что вызод из функции WinMain не осуществялется до закрытия окна, а зациливается обаботка сообщений, и до этого зацикливания создается объект MyClass и после того как вызывается мной конструктор, почему то после него вызывается деструктор. Если объявить var как указатель и инициализировать соответсвующим образом (var = new MyClass()) то все в норме. И вот вопрос в том почему вызывается деструктор до выхода из функции, а точнее после вызова самого конструткора?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.08.2012, 13:51     Не понятный вызов деструктора #6
Byurrer, еще раз прочтите сообщение #4.
Byurrer
2 / 2 / 0
Регистрация: 09.04.2011
Сообщений: 110
11.08.2012, 13:53  [ТС]     Не понятный вызов деструктора #7
soon, прочел, ситуация немного не та, в 4 посте осуществялется выход из функциии ессесно будет вызываться деструктор, а у меня не происходит выход из функциии и всеравно вызывается деструктор.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 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
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
11.08.2012, 14:02     Не понятный вызов деструктора #9
Byurrer, в строке
C++
1
var = MyClass(/*аргументы*/);
Создаётся временный безымянный объект класса MyClass, этот объект копируется в var, затем временный объект разрушается с вызовом деструктора. Для переменной var при этом деструктор здесь не вызывается. Как определялось, что деструктор вызывается когда не надо?
Если при разрушении временного объекта что-то нарушается в копии var, то это означает, что используется неправильный копирующий конструктор.
Byurrer
2 / 2 / 0
Регистрация: 09.04.2011
Сообщений: 110
11.08.2012, 14:06  [ТС]     Не понятный вызов деструктора #10
Определял так, в конце конструктора МессиджБокс выдавал, и в деструткоре (ессесно с обозначением где конструткор, а где деструктор) и наблюдал эти два мессиджа друг за другом.
grizlik78, то есть по сути деструтор там не должен вызываться?
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
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
Byurrer
2 / 2 / 0
Регистрация: 09.04.2011
Сообщений: 110
11.08.2012, 14:09  [ТС]     Не понятный вызов деструктора #12
ValeryS, не дурень понимаю, но у меня написано по другому, я уже писал в предыдущих постах.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
11.08.2012, 14:11     Не понятный вызов деструктора #13
Цитата Сообщение от grizlik78 Посмотреть сообщение
то это означает, что используется неправильный копирующий конструктор.
Ах да, в том месте не конструктор, а оператор присваивания используется. Но сути это не меняет. И конструктор копирования и оператор присваивания должны обеспечивать сохранность копии после разрушения оригинала.

Цитата Сообщение от Byurrer Посмотреть сообщение
grizlik78, то есть по сути деструтор там не должен вызываться?
Деструктор временного объекта должен вызываться и вызывается. Деструктор var в этом месте не вызывается. Он будет вызываться только в конце программы, один раз.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.08.2012, 14:12     Не понятный вызов деструктора #14
Byurrer, ну так приведите пример вашего кода.
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
11.08.2012, 14:12     Не понятный вызов деструктора #15
Цитата Сообщение от Byurrer Посмотреть сообщение
ValeryS, не дурень понимаю, но у меня написано по другому, я уже писал в предыдущих постах.
тебе 3 поста подряд пишут что вызывается деструктор временного объекта
примерно выходит так
.......
C++
1
2
3
4
{
 MyClass tmp (/*аргументы*/);
var =tmp;
}
так понятно чей деструктор вызывается?
Byurrer
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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2012, 14:15     Не понятный вызов деструктора
Еще ссылки по теме:

C++ Явный вызов деструктора
Вызов деструктора C++
вызов деструктора для копии C++

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

Или воспользуйтесь поиском по форуму:
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 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;
}
На вывод смотрите.
Yandex
Объявления
11.08.2012, 14:15     Не понятный вызов деструктора
Ответ Создать тему
Опции темы

Текущее время: 11:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru