Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452

Исключительные ситуации (повторный вызов деструктора)

05.06.2015, 15:22. Показов 2820. Ответов 59
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет !

Подскажите пожалуйста , почему повторно вызываются деструкторы класса A,B,C?

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <stdio.h>
#include <conio.h>
 
class Ana
 
{
    int x;
 
public:
 
    Ana(int c); 
 
    ~Ana() {}
    
    int ghf() const {return x;}
 
    class A 
    
    { 
    
    public: 
        
        A() {printf("\nKONSTRUKTOR A %p\n",this);}
 
        ~A() {printf("\nDESTRUKTOR A %p\n",this);}
    };
 
    class B : public A 
    
    {
    
    public: 
        
        B() {printf("\nKONSTRUKTOR B %p\n",this);}
 
        ~B() {printf("\nDESTRUKTOR B %p\n",this);}
    };
 
    class C : public B 
    
    {
    
    public: 
        
        C() {printf("\nKONSTRUKTOR C %p\n",this);}
 
        ~C() {printf("\nDESTRUKTOR C %p\n",this);}
    };
};
 
Ana :: Ana(int c) :
 
x(c)
 
{
    if(c == 0) throw B();
 
    if(c < 0) throw A();
 
    if(c > 10) throw C();
}
 
int main()
 
{
    try
 
    {
        Ana s(11);
 
        printf("\n-------- %d\n",s.ghf());
    }
 
 
    catch (Ana :: C)
 
    {
        printf("\n****** c > 10\n");
    }
 
    catch (Ana :: B)
 
    {
        printf("\n****** c == 0\n");
    }
 
 
    catch (Ana :: A)
 
    {
        printf("\n****** c < 0\n");
    }
        
 
        getch();
 
        return 0;
}
Миниатюры
Исключительные ситуации (повторный вызов деструктора)  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.06.2015, 15:22
Ответы с готовыми решениями:

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

Повторный вызов деструктора для объекта
Здравствуйте! К сожалению, я пока не умею пользоваться отладчиком для анализа работы программ, поэтому в очередной раз обращаюсь к вам...

Исключительные ситуации
Функция должна выполнять проверку параметров, передаваемых и генерировать исключения в случае ошибки. Без спецификаторов исключений; ...

59
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
05.06.2015, 15:29
Забыли про конструкторы копирования
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
05.06.2015, 16:01  [ТС]
а при чем тут копирование ?

я же нечего не передаю в функцию как значение .
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
05.06.2015, 16:08
Цитата Сообщение от RAFA91 Посмотреть сообщение
а при чем тут копирование ?
Лишнее копирование происходит из-за ловли исключения по значению, а не по ссылке.
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
05.06.2015, 17:49  [ТС]
и куда этот обьект идет ?

в catch ?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
05.06.2015, 17:53
C++
1
catch ( Ana::C & )
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
06.06.2015, 12:14  [ТС]
castaway в данном случае , что имеется ввиду ?

передача обьекта в catch как ссылки ?

сделал так , но всеравно получаю повторный вызов деструктора (((

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 catch (Ana :: C &a)
 
    {
        printf("\n****** c > 10\n");
    }
 
    catch (Ana :: B &a)
 
    {
        printf("\n****** c == 0\n");
    }
 
 
    catch (Ana :: A &a)
 
    {
        printf("\n****** c < 0\n");
    }
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.06.2015, 13:05
Цитата Сообщение от RAFA91 Посмотреть сообщение
сделал так , но всеравно получаю повторный вызов деструктора (((
А у меня нет повторного вызова деструктора.
1
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
06.06.2015, 13:06
Лучший ответ Сообщение было отмечено RAFA91 как решение

Решение

RAFA91, вот пример.
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
06.06.2015, 13:27  [ТС]
Alex5 тут я увидел вызов копировщика.

я написал следующее

C++
1
2
3
4
5
catch (Ana :: C &a)
 
catch (Ana :: B &a)
 
catch (Ana :: A &a)
и получид это.

как я понял второй раз деструктора вызываются при выходе из catch .

тогда первый раз когда они вызываются ?

не могу понять зачем первый раз они вызываются , если я в catch передаю обьект как ссылку (((
Миниатюры
Исключительные ситуации (повторный вызов деструктора)  
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.06.2015, 13:31
Покажи полный код.
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
06.06.2015, 13:53  [ТС]
какой-то бред лезит и лезит.

по идеи должен получать сообщения от копировщиков

C++
1
A(const A & rhs) {printf("\nKONSTRUKTOR A copy %p %p\n",this,& rhs);}
C++
1
    B(const B & rhs) {printf("\nKONSTRUKTOR B copy %p %p\n",this,& rhs);}
C++
1
C(const C & rhs) {printf("\nKONSTRUKTOR C copy %p %p\n",this,& rhs);}
но увы получаю это

_______________________

полный код

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <stdio.h>
#include <conio.h>
 
class Ana
 
{
    int x;
 
public:
 
    Ana(int c); 
 
    ~Ana() {}
    
    int ghf() const {return x;}
 
    class A 
    
    { 
    
    public: 
        
        A() {printf("\nKONSTRUKTOR A %p\n",this);}
 
        A(const A & rhs) {printf("\nKONSTRUKTOR A copy %p %p\n",this,& rhs);}
 
        ~A() {printf("\nDESTRUKTOR A %p\n",this);}
    };
 
    class B : public A 
    
    {
    
    public: 
        
        B() {printf("\nKONSTRUKTOR B %p\n",this);}
 
        B(const B & rhs) {printf("\nKONSTRUKTOR B copy %p %p\n",this,& rhs);}
 
        ~B() {printf("\nDESTRUKTOR B %p\n",this);}
    };
 
    class C : public B 
    
    {
    
    public: 
        
        C() {printf("\nKONSTRUKTOR C %p\n",this);}
 
        C(const C & rhs) {printf("\nKONSTRUKTOR C copy %p %p\n",this,& rhs);}
 
        ~C() {printf("\nDESTRUKTOR C %p\n",this);}
    };
};
 
Ana :: Ana(int c) :
 
x(c)
 
{
    if(c == 0) throw B();
 
    if(c < 0) throw A();
 
    if(c > 10) throw C();
}
 
int main()
 
{
    try
 
    {
        Ana s(11);
 
        printf("\n-------- %d\n",s.ghf());
    }
 
 
    catch (Ana :: C )
 
    {
        printf("\n****** c > 10\n");
    }
 
    catch (Ana :: B )
 
    {
        printf("\n****** c == 0\n");
    }
 
 
    catch (Ana :: A )
 
    {
        printf("\n****** c < 0\n");
    }
        
 
        getch();
 
        return 0;
}
______________

тут получаю вызов только от одного копировщика (((

http://ideone.com/L9yL5Y
Миниатюры
Исключительные ситуации (повторный вызов деструктора)  
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.06.2015, 14:02
А ты не пробовал сначала решать одну проблему, а потом перейти к другой?
То у тебя деструкторы по два раза вызываются, то уже сразу конструктор копирования откуда то появился.
Что с той проблемой?
1
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
06.06.2015, 14:08
Цитата Сообщение от RAFA91 Посмотреть сообщение
тут получаю вызов только от одного копировщика (((
C++
1
2
3
4
5
6
7
8
9
class C : public B 
{
public: 
C() {printf("\nKONSTRUKTOR C %p\n",this);}
C(const C & rhs)                  /*  так как явно не указано, какой  конструктор вызывать,      */
                                        /*     здесь будет вызван к-тор без параметров B::B() */
{
    printf("\nKONSTRUKTOR C copy %p %p\n",this,& rhs);
}
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
06.06.2015, 14:14  [ТС]
Вы не поверите , но когда я тупо прописал в классах A,B,C копировщики , то проблема ушла.

но зато всплыла другая.

Alex5 показал результат работы программы

у меня этот результат сильно отличается

у него аж 3 раза вызвался копировщик , а у меня только один раз.

В чем проблема ?

___________________________

http://ideone.com/8hYEgj
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.06.2015, 14:16
Лучший ответ Сообщение было отмечено RAFA91 как решение

Решение

Цитата Сообщение от RAFA91 Посмотреть сообщение
Вы не поверите , но когда я тупо прописал в классах A,B,C копировщики , то проблема ушла.
Не поверю. Ты говорил что в catch у тебя ссылки, а их там нет.
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
06.06.2015, 14:24  [ТС]
Вообщем первоначальный код был таким

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <stdio.h>
#include <conio.h>
 
class Ana
 
{
    int x;
 
public:
 
    Ana(int c); 
 
    Ana(const Ana & rhs) {printf("\nKONSTRUKTOR Ana copy %p %p\n",this,& rhs);}
 
    ~Ana() {}
    
    int ghf() const {return x;}
 
    class A 
    
    { 
    
    public: 
        
        A() {printf("\nKONSTRUKTOR A %p\n",this);}
 
        //A(const A & rhs) {printf("\nKONSTRUKTOR A copy %p %p\n",this,& rhs);}
 
        ~A() {printf("\nDESTRUKTOR A %p\n",this);}
    };
 
    class B : public A 
    
    {
    
    public: 
        
        B() {printf("\nKONSTRUKTOR B %p\n",this);}
 
        //B(const B & rhs) {printf("\nKONSTRUKTOR B copy %p %p\n",this,& rhs);}
 
        ~B() {printf("\nDESTRUKTOR B %p\n",this);}
    };
 
    class C : public B 
    
    {
    
    public: 
        
        C() {printf("\nKONSTRUKTOR C %p\n",this);}
 
        //C(const C & rhs) {printf("\nKONSTRUKTOR C copy %p %p\n",this,& rhs);}
 
        ~C() {printf("\nDESTRUKTOR C %p\n",this);}
    };
};
 
Ana :: Ana(int c) :
 
x(c)
 
{
    if(c == 0) throw B();
 
    if(c < 0) throw A();
 
    if(c > 10) throw C();
}
 
int main()
 
{
    try
 
    {
        Ana s(11);
 
        printf("\n-------- %d\n",s.ghf());
    }
 
 
    catch (Ana :: C )
 
    {
        printf("\n****** c > 10\n");
    }
 
    catch (Ana :: B )
 
    {
        printf("\n****** c == 0\n");
    }
 
 
    catch (Ana :: A )
 
    {
        printf("\n****** c < 0\n");
    }
        
 
        getch();
 
        return 0;
}
теперь разблокировал копировщики

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <stdio.h>
#include <conio.h>
 
class Ana
 
{
    int x;
 
public:
 
    Ana(int c); 
 
    Ana(const Ana & rhs) {printf("\nKONSTRUKTOR Ana copy %p %p\n",this,& rhs);}
 
    ~Ana() {}
    
    int ghf() const {return x;}
 
    class A 
    
    { 
    
    public: 
        
        A() {printf("\nKONSTRUKTOR A %p\n",this);}
 
        A(const A & rhs) {printf("\nKONSTRUKTOR A copy %p %p\n",this,& rhs);}
 
        ~A() {printf("\nDESTRUKTOR A %p\n",this);}
    };
 
    class B : public A 
    
    {
    
    public: 
        
        B() {printf("\nKONSTRUKTOR B %p\n",this);}
 
        B(const B & rhs) {printf("\nKONSTRUKTOR B copy %p %p\n",this,& rhs);}
 
        ~B() {printf("\nDESTRUKTOR B %p\n",this);}
    };
 
    class C : public B 
    
    {
    
    public: 
        
        C() {printf("\nKONSTRUKTOR C %p\n",this);}
 
        C(const C & rhs) {printf("\nKONSTRUKTOR C copy %p %p\n",this,& rhs);}
 
        ~C() {printf("\nDESTRUKTOR C %p\n",this);}
    };
};
 
Ana :: Ana(int c) :
 
x(c)
 
{
    if(c == 0) throw B();
 
    if(c < 0) throw A();
 
    if(c > 10) throw C();
}
 
int main()
 
{
    try
 
    {
        Ana s(11);
 
        printf("\n-------- %d\n",s.ghf());
    }
 
 
    catch (Ana :: C )
 
    {
        printf("\n****** c > 10\n");
    }
 
    catch (Ana :: B )
 
    {
        printf("\n****** c == 0\n");
    }
 
 
    catch (Ana :: A )
 
    {
        printf("\n****** c < 0\n");
    }
        
 
        getch();
 
        return 0;
}
Миниатюры
Исключительные ситуации (повторный вызов деструктора)   Исключительные ситуации (повторный вызов деструктора)  
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.06.2015, 15:10
Лучший ответ Сообщение было отмечено RAFA91 как решение

Решение

Цитата Сообщение от RAFA91 Посмотреть сообщение
у него аж 3 раза вызвался копировщик , а у меня только один раз.
C++
1
        C( const C& _c ):B(_c){ printf("\n C( const C& ) \n"); }
Он из конструктора копирования класса C вызывает конструктор копирования подлежащего класса B, из B вызывает A.
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
06.06.2015, 15:22  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Он из конструктора копирования класса C вызывает конструктор копирования подлежащего класса B, из B вызывает A.

точно. не увидел этот момент.

а разве при насследовании копировщики от нижнего уровня до верхнего не вызываются автоматически ?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.06.2015, 15:30
Цитата Сообщение от RAFA91 Посмотреть сообщение
а разве при насследовании копировщики от нижнего уровня до верхнего не вызываются автоматически ?
Нет, не вызываются.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.06.2015, 15:30
Помогаю со студенческими работами здесь

Исключительные ситуации
Почему программа не работает?? Исключительная ситуация возникающая при деление на нуль. Пользователь с клавиатуры должен ввести число, если...

Исключительные ситуации
Доброго времени суток. Возникла такая проблема. Никак не могу разобраться с исключительными ситуациями. Вот допустим, как здесь сделать,...

исключительные ситуации
Описать и реализовать функцию анализа номера телефона, обработайте ошибку создания номера в неверном формате (допустимый формат - +8 (095)...

Исключительные ситуации
Как обработать исключительную ситуацию,когда переменная описана как int,к примеру,а вводится какой-нибудь char?А то нам как то в лекции...

исключительные ситуации
Подскажите, как сделать переполнение в этой задаче: Создать класс для хранения обыкновенных дробей. Запрограммировать метод сокращения...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru