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

Вызывается деструктор когда обьект не уничтожен! - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
][акер
#define книжный_червь Я
 Аватар для ][акер
182 / 93 / 6
Регистрация: 30.01.2010
Сообщений: 780
03.05.2010, 20:41     Вызывается деструктор когда обьект не уничтожен! #1
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "stdafx.h"
#include <iostream>
#include <conio.h>
 
using namespace std;
 
class inkr {
private:
    int a;
public:
    inkr(int b): a(b) {}
    ~inkr()
    {
        cout << "И помните! Этот класс написал Григорий Сабинин!\n";
        _getch();
    }
    int operator++()
    {
        a--;
        return a;
    }
    int operator--()
    {
        a++;
        return a;
    }
    void show()
    {
        cout << a << endl;
    }
};
 
int main()
{
    setlocale(LC_ALL,"");
    inkr a = 8,b = 2;
    --b;
    b.show(); // После этого вызывается деструктор! :(
    a = ++a + --b;
    a.show();
    _getch();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2010, 20:41     Вызывается деструктор когда обьект не уничтожен!
Посмотрите здесь:

Два раза вызывается деструктор C++
Когда вызывается деструктор класса? C++
Не вызывается деструктор C++
C++ Деструктор не вызывается
Не вызывается деструктор C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 21:04     Вызывается деструктор когда обьект не уничтожен! #2
[акер;702689]cout << "И помните! Этот класс написал Григорий Сабинин!\n";
если вместо бесполезной строчки вставить это:
C++
1
cout << a << " - deleted" << endl;
всё встанет на свои места

вывод программы (комментарии мои):
C++
1
2
3
4
5
3 // b.show();
11 - deleted // a = ++a + --b;
11 // a.show();
4 - deleted // удаление b при выходе
11 - deleted // удаление a при выходе
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 21:11     Вызывается деструктор когда обьект не уничтожен! #3
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream> 
using namespace std;
class inkr {
private:
        int a;
public:
        inkr(int b): a(b) {}
        ~inkr()
        {
                cout << "destroy\n";
    
        }
 
        inkr& operator++()
        {
                a++;
                return *this;
        }
        inkr& operator--()
        {
                a--;
                return *this;
        }
 
        void show()
        {
                cout << a << '\n';
        }
 
 
inkr operator + (inkr& ptr){
        inkr tmp(*this);
        tmp.a+=ptr.a;
        return tmp; 
        }
};
 
int main()
{
       
        inkr a = 8, b = 2;
        --b;
 
        b.show(); 
        a = ++a + --b;
        a.show();
 
  return 0;
}
В операции + вызывается деструктор, и в операции присваивания вызывается деструктор,
и два деструктора в конце работы main.
Больше ни чего особенного нет.
Я даже не понимаю как ваш пример запустился без определения операции +
][акер
#define книжный_червь Я
 Аватар для ][акер
182 / 93 / 6
Регистрация: 30.01.2010
Сообщений: 780
03.05.2010, 21:11  [ТС]     Вызывается деструктор когда обьект не уничтожен! #4
А я чё то не понял! При передаче нового значения обьекту вызывается деструктор?
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 21:31     Вызывается деструктор когда обьект не уничтожен! #5
операции присваивания вызывается деструктор,
Не то ляпнул, не из-за операции присваивания, только из-за +

Добавлено через 2 минуты
Просто в операции + два конструктора == два деструктора .

Добавлено через 5 минут
И вообще a = ++a + --b; составное выражение.
Второй деструктор будет вызван после того как операция присваивания поработает с объектом
который вернулся из +
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 21:38     Вызывается деструктор когда обьект не уничтожен! #6
Genius Ignat, операция "+" с объектами ничего не делает

a = ++a + --b; -> a = 7 + 4; -> a = 11;
деструктор вызывается при попытке присвоить число - вызывается контсруктор inkr(int b)

C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
        inkr a = 8;
        a = 11;
        a.show();
        _getch();
}
 
вывод:
11 - deleted
11
11 - deleted
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 21:47     Вызывается деструктор когда обьект не уничтожен! #7
Roma_F:
Я работаю со свои примером и анализирую его, и мой пример верен, и анализ правильный.
В Философию программы: которую написал ][акер, вникать не хочется,
просто не понял, что этим он хотел сказать.

Добавлено через 2 минуты
Я даже не понимаю как ваш пример запустился без определения операции +
Это я понимаю, но зачем было затевать оболочку int когда работаешь не так как этого требует
смысл оболочки.
Iworb
анимешник++
 Аватар для Iworb
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 411
03.05.2010, 21:48     Вызывается деструктор когда обьект не уничтожен! #8
не переопределена операция сложения двух объектов.
operator + переопредели и все должно сработать
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 21:48     Вызывается деструктор когда обьект не уничтожен! #9
Genius Ignat, ааа, не обратил внимание что у тебя свой код
думал ты процитировал верхний
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 21:51     Вызывается деструктор когда обьект не уничтожен! #10
Iworb:
Дело даже не в этом, ты посмотри что возвращают операции ++ и -- они возвращают int
а для int + определен автоматически.
Iworb
анимешник++
 Аватар для Iworb
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 411
03.05.2010, 21:55     Вызывается деструктор когда обьект не уничтожен! #11
[акер;702689]int operator--()
{
a++;
return a;
}
затем вы вызываете --b
по схеме переопределенный оператор возвращает тип int, следовательно он откуда-то его получает и куда-то отдает. --b - получает из b, а возвращает куда? насколько я помню оператор должен быть того же класса, что и объект и возвращать также объект.

Добавлено через 1 минуту
ах да, они еще должны принимать объект класса..... Для инкриментных - один, для декриментых - два...
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 21:57     Вызывается деструктор когда обьект не уничтожен! #12
Iworb:
Махинации с возвратом объектов операциями ++ -- типа не класс,
допустимы, и почему стандарт над этим не поработает, просто это бессмысленно, прокачивать
int когда твоя оболочка и так int.
Iworb
анимешник++
 Аватар для Iworb
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 411
03.05.2010, 21:58     Вызывается деструктор когда обьект не уничтожен! #13
C++
1
2
3
4
int Get_a() {return a;}
void Set_a(int newa) {a=newa; return;}
inkr operator++(inkr&c)
{ a=Set_a(Get_a()-1); return c;}
мне кажется так будет правильно. Или я ошибаюсь?
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 22:01     Вызывается деструктор когда обьект не уничтожен! #14
принимать объект класса..... Для инкриментных - один, для декриментых - два...
Принимать объект не надо, потому как объект сам вызывает операцию ++ или -- .

Добавлено через 1 минуту
Объект сам работает со своими данными, и поэтому ни каких посредников для операции не надо.
Iworb
анимешник++
 Аватар для Iworb
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 411
03.05.2010, 22:08     Вызывается деструктор когда обьект не уничтожен! #15
C++
1
2
3
4
5
nt operator--()
{
a++;
return a;
}
Раз так, то смысл в этой функции? Раз она работает с элементами класса, то ей ненужно ничего возвращать, если же там должен быть тип int, то при вызове ++b возвращается тип int и записывается в переменную b, которая является переменной типа inkr, поэтому я и говорю, что возвращать нужно объект. Я понимаю, что объект состоит только из одного целочисленного значения, но все-равно чувствую тут подвох =/
][акер
#define книжный_червь Я
 Аватар для ][акер
182 / 93 / 6
Регистрация: 30.01.2010
Сообщений: 780
03.05.2010, 22:09  [ТС]     Вызывается деструктор когда обьект не уничтожен! #16
Я кажется понял! При операции присваивания вызывается в начале деструктор, а потом и конструктор?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2010, 22:27     Вызывается деструктор когда обьект не уничтожен!
Еще ссылки по теме:

C++ При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О
C++ Вызывается ли деструктор в данной программе?
C++ Почему не вызывается деструктор?

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

Или воспользуйтесь поиском по форуму:
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 22:27     Вызывается деструктор когда обьект не уничтожен! #17
[акер;702968]При операции присваивания вызывается в начале деструктор, а потом и конструктор?
Как я понимаю: когда объкту inkr присваивается число - происходит скрытый вызов "конструктора преобразования", в данном случае inkr(int). Создаётся временный объект и копируется в исходный.
по стадиям:
C++
1
2
3
a = 11;
a = x(11);
a = x;
Yandex
Объявления
03.05.2010, 22:27     Вызывается деструктор когда обьект не уничтожен!
Ответ Создать тему
Опции темы

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