powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / наследование, исключения.
30 сообщений из 30, показаны все 2 страниц
наследование, исключения.
    #34457411
StepLg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть класс A, в котором генерируется исключение. Класс B наследуется от него. В обоих классах имеются данные, которые необходимо уничтожить при вызове этого исключения.

Понятно, что это можно сделать какой-нибудь виртуальной функцией функцией. А что делать, если нужно вызвать деструктор? Прямой вызов в классе A деструктора this->~A() естественно не вызовет деструктор ~B(), как хотелось бы. Есть ли возможность это сделать? или вообще никак нельзя?
...
Рейтинг: 0 / 0
наследование, исключения.
    #34457470
А что делать, если нужно вызвать деструктор? Прямой вызов в классе A деструктора this->~A() естественно не вызовет деструктор ~B(), как хотелось бы. Есть ли возможность это сделать? или вообще никак нельзя?

непосредственный вызов деструктора используется в крайне редких случаях, вряд ли вам это нужно

так что два варианта: виртуальный метод очистки, либо ловим в B исключение чистим что надо и дальше его кидаем

особо отмечу случай если исключение происходит в конструкторе
...
Рейтинг: 0 / 0
наследование, исключения.
    #34457490
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StepLg пишет:

> Понятно, что это можно сделать какой-нибудь виртуальной функцией
> функцией. А что делать, если нужно вызвать деструктор? Прямой вызов в
> классе A деструктора this->~A() естественно не вызовет деструктор ~B(),
> как хотелось бы. Есть ли возможность это сделать? или вообще никак нельзя?

Просто удали объект. Все будет хорошо, деструктор B вызовется сам.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
наследование, исключения.
    #34457492
StepLg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в B мы можем отловить ислючение только в случае, если метод из А вызываем методом из B. Да и то это проходит только для обычных методов. А вот, к примеру (как Вы правильно отметили - у меня так и происходит :) ), если исключение вызывается в конструкторе - то в конструкторе B его уже никак не отловить:(

Так что для ситуации, когда B наследует несколько классов, парочка из них инициализируется, а потом A генерит exeption, то получается утечка памяти в тех классах, которые остались без вызова деструктора.

Кстати, а что, есть возможность отловить исключение производным классом, как бы оно не генерировалось в базовом? По-моему такого способа нет. Только если функция базового вызывается из функции производного.
...
Рейтинг: 0 / 0
наследование, исключения.
    #34457500
StepLg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
StepLg пишет:

> Понятно, что это можно сделать какой-нибудь виртуальной функцией
> функцией. А что делать, если нужно вызвать деструктор? Прямой вызов в
> классе A деструктора this->~A() естественно не вызовет деструктор ~B(),
> как хотелось бы. Есть ли возможность это сделать? или вообще никак нельзя?

Просто удали объект. Все будет хорошо, деструктор B вызовется сам.
Posted via ActualForum NNTP Server 1.4

и как же его удалить? ) из основного кода? Не хорошо получается. Опять же, ситуация, когда исключение генерится в конструкторе одного из базовых объектов класса. Получается, что часть объектов уже инициализирована, а часть еще нет. Вызывать деструктор для всех подряд - смерти подобно. Не вызывать совсем - черевато утечкой памяти. Причем виртуальная функция очистки объектов здесь не пройдет никак. (почему - объяснять или нет?)
...
Рейтинг: 0 / 0
наследование, исключения.
    #34457531
StepLg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кстати, просто удалить объект нельзя. он же по сути не существует. После исключение в конструкторе A конструктор B не вызывается, а значит объект B не существует. (интересно, а существует ли объект A - успел он создаться по стандарту или нет... это тоже тот еще вопрос). Поэтому никакие методы, включая деструктор, у B вызывать нельзя. Кстати, это причина, по которой нельзя пользоваться виртуальностью.
...
Рейтинг: 0 / 0
наследование, исключения.
    #34457563
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StepLgкстати, просто удалить объект нельзя. он же по сути не существует. После исключение в конструкторе A конструктор B не вызывается, а значит объект B не существует. (интересно, а существует ли объект A - успел он создаться по стандарту или нет... это тоже тот еще вопрос). Поэтому никакие методы, включая деструктор, у B вызывать нельзя. Кстати, это причина, по которой нельзя пользоваться виртуальностью.
Запусти вот это и посмотри на вывод, все вопросы отпадут.
Код: plaintext
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.
#include <iostream>
using namespace std;

class A {
public:
	A() {
		cout << "A()\n";
		//throw 1;
	}
	~A() {
		cout << "~A()\n";
	}
};

class B {
public:
	B() {
		cout << "B()\n";
		throw  2 ;
	}
	~B() {
		cout << "~B()\n";
	}
};

class C : A,B {
public:
	C() {
		cout << "C()\n";
		throw  3 ;
	}
	~C() {
		cout << "~C()\n";
	}
};

int main() {
	try {
		C var;
		cout << "main()\n";
	} catch (int e) {
		cout << e;
	}
	return  0 ;
}
...
Рейтинг: 0 / 0
наследование, исключения.
    #34457580
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StepLg пишет:

> в B мы можем отловить ислючение только в случае, если метод из А
> вызываем методом из B. Да и то это проходит только для обычных методов.
> А вот, к примеру (как Вы правильно отметили - у меня так и происходит :)
> ), если исключение вызывается в конструкторе - то в конструкторе B его
> уже никак не отловить:(

Почему не отловить ? внутри тела констуктора лови сколько хочешь.

> Так что для ситуации, когда B наследует несколько классов, парочка из
> них инициализируется, а потом A генерит exeption, то получается утечка
> памяти в тех классах, которые остались без вызова деструктора.

Такого не может быть. Если при вызове конструктора выбрасывается
исключение, C++ правильно вызывает все деструкторы и удаляет
память (если объект создавался в динамической памяти).

В ситуации, когда B наследуется от нескольких классов, и при
инициализации одного из подъобъектов выбрасывается exception,
С++ корректно вызовет деструкторы всех подъобъектов, которые к этому
времени уже успели проинициализироваться, и никакая память никуда
не утечет, если деструкторы написаны правильно.

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

Исключения не зависят от наследования. Они зависят от стека вызовов
функций.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
наследование, исключения.
    #34457582
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StepLg пишет:
> Просто удали объект. Все будет хорошо, деструктор B вызовется сам.
> и как же его удалить?

Если ты не понимаешь, приведи свой код, может кто-то что-то и скажет.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
наследование, исключения.
    #34457585
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StepLg пишет:
> кстати, просто удалить объект нельзя. он же по сути не существует. После
> исключение в конструкторе A конструктор B не вызывается, а значит объект
> B не существует.

Неправильно. Объект существует, но не проинициализирован.

> никакие методы, включая деструктор, у B вызывать нельзя. Кстати, это
> причина, по которой нельзя пользоваться виртуальностью.

Чего ??
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
наследование, исключения.
    #34457634
StepLg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
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.
class A
{
private:
  int i_;
public:
  A(const int i) : i_(i) { cout << "   A() " << i << "\n";}
  ~A(){cout << "   ~A() " << i_ << "\n";}
};

class B
{
private:
  vector<A*> vect;
public:
  B(const int n);
  virtual ~B();
};

B::B(const int n)
{
  cout << " B()\n";
  for (int i= 0 ; (i< 10 )&&(i<n); ++i)
    vect.push_back(new A(i));
  cout << "THROW!!!!\n";
  throw  1 ;
}

B::~B()
{
  cout << " ~B()\n";
  int n = vect.size();
  for (int i= 0 ; i<n; ++i)
    delete vect[i];
}

class G
{
public:
  G() { cout << " G()\n"; }
  ~G() { cout << " ~G()\n"; }
};

class C : public G, public B
{
public:
  C(const int i) :G(), B(i) {cout << "C()\n";}
  virtual ~C() { cout << "~C()\n"; }
};

int main()
{
  C b( 7 );
  return  0 ;
}

выводит:
G()
B()
A() 0
A() 1
A() 2
A() 3
A() 4
A() 5
A() 6
THROW!!!!
terminate called after throwing an instance of 'int'
Aborted
...
Рейтинг: 0 / 0
наследование, исключения.
    #34457643
StepLg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а.. все.
если в мейне добавить try блок, то G() удалится нормально. а A мы можем и самостоятельно деинициализировать до выброса исключения :)
...
Рейтинг: 0 / 0
наследование, исключения.
    #34457703
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StepLg пишет:

> а.. все.
> если в мейне добавить try блок, то G() удалится нормально. а A мы можем
> и самостоятельно деинициализировать до выброса исключения :)

Ты так ничего и не понял.

G удалится нормально В ЛЮБОМ СЛУЧАЕ.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
наследование, исключения.
    #34457797
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
G удалится нормально В ЛЮБОМ СЛУЧАЕ.
Posted via ActualForum NNTP Server 1.4
Ой, и мне объясни тогда, почему нет печати из деструктора G.
Я не совсем вкурил.
...
Рейтинг: 0 / 0
наследование, исключения.
    #34457800
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StepLgа.. все.
если в мейне добавить try блок, то G() удалится нормально. а A мы можем и самостоятельно деинициализировать до выброса исключения :)
Будь добр, приведи пример, чего ты собрался самостоятельно деинициализировать. Есть предположение, что оно работать не будет.
...
Рейтинг: 0 / 0
наследование, исключения.
    #34458022
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотите я открою вам страшную тайну? забудьте '\n'. пользуйтесь endl У вас буфер не сфлешился
...
Рейтинг: 0 / 0
наследование, исключения.
    #34458250
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedХотите я открою вам страшную тайну? забудьте '\n'. пользуйтесь endl У вас буфер не сфлешился

хотя я вам открою страшную тайну?
endl перегруженные оператор на '\n'
...
Рейтинг: 0 / 0
наследование, исключения.
    #34458272
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aklin blindedХотите я открою вам страшную тайну? забудьте '\n'. пользуйтесь endl У вас буфер не сфлешился

хотя я вам открою страшную тайну?
endl перегруженные оператор на '\n'
А вот и нет это ends такой, а endl = ends + flush
...
Рейтинг: 0 / 0
наследование, исключения.
    #34458739
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grieg пишет:
> Ой, и мне объясни тогда, почему нет печати из деструктора G.
> Я не совсем вкурил.

Я был не прав, не вызовется. Но на самом деле я и немного не
то имел в виду. Что деструкторы будут вызываться (или не вызываться)
безотносительно наличия стека обработки исключений где-либо.

В общем, для всех полностью сконструированных подобъектов
всегда будут вызваны деструкторы при выбрасывании исключения.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
наследование, исключения.
    #34458746
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aklin пишет:
> хотя я вам открою страшную тайну?
> endl перегруженные оператор на '\n'

endl еще и вызывает flush() для потока. Поэтому << "\n" и << endl не эквивалентны.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
наследование, исключения.
    #34459539
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
В общем, для всех полностью сконструированных подобъектов
всегда будут вызваны деструкторы при выбрасывании исключения.


Так почему в примере автора не вызывается? Если вставить в main блок try/catch(...), то вызывается.

Топикстартеру. Содержательным вопросом случай, когда конструктор пробует захватить два ресурса и обламывается на втором. Деструктор не отрабатывает (поскольку объект так и не был создан) и первый ресурс "утекает". На этот случай есть правило: один конструктр -- один захват ресурса. Ну или можно думать о каких-то других методах. Например, захватывать память в auto_ptr, а потом уже передавать управление ей конструируемому объекту.
...
Рейтинг: 0 / 0
наследование, исключения.
    #34459617
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grieg MasterZiv
В общем, для всех полностью сконструированных подобъектов
всегда будут вызваны деструкторы при выбрасывании исключения.


Так почему в примере автора не вызывается? Если вставить в main блок try/catch(...), то вызывается.

Да вызывается он, просто печать не происходит, в буфере застревает.
grieg
Топикстартеру. Содержательным вопросом случай, когда конструктор пробует захватить два ресурса и обламывается на втором. Деструктор не отрабатывает (поскольку объект так и не был создан) и первый ресурс "утекает". На этот случай есть правило: один конструктр -- один захват ресурса. Ну или можно думать о каких-то других методах. Например, захватывать память в auto_ptr, а потом уже передавать управление ей конструируемому объекту.
Да у нас эта проблема возникает чуть ли не каждый месяц. если пошарить по форуму 10 ответов найдешь как правильно
...
Рейтинг: 0 / 0
наследование, исключения.
    #34460324
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded
Да вызывается он, просто печать не происходит, в буфере застревает.

Увы, я проверял с cout<<endl -- не вызывается.
Во всяком случае не выводится.
...
Рейтинг: 0 / 0
наследование, исключения.
    #34460469
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StepLgЕсть класс A, в котором генерируется исключение. Класс B наследуется от него. В обоих классах имеются данные, которые необходимо уничтожить при вызове этого исключения.

Понятно, что это можно сделать какой-нибудь виртуальной функцией функцией. А что делать, если нужно вызвать деструктор? Прямой вызов в классе A деструктора this->~A() естественно не вызовет деструктор ~B(), как хотелось бы. Есть ли возможность это сделать? или вообще никак нельзя?

Не понял. Вы хотите внутри класса A или B перехватить исключение из этого же класса и в нём же вызвать деструктор? Это круто, но невозможно.
...
Рейтинг: 0 / 0
наследование, исключения.
    #34460866
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проведенные исследования показали, что реальная раскрутка стека (вызов деструкторов и т.д.)
производится в момент обработки исключения. Не будет перехвата исключения - стек не раскрутится. Провеял и на gcc и VisualC++.
...
Рейтинг: 0 / 0
наследование, исключения.
    #34461246
StepLg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот! наконец то меня поняли :)

вообщем, что у меня получилось:
1) объект создается в стэке.
Если исключение вызывается внутри try блока, то вызываются деструкторы для всех объектов, которые были полностью созданы, иначе не вызывается ничего.

2) объект создается динамически через new.
понятное дело, что никакие деструкторы не вызываются. При вызове delete получаем вызовы деструкторов для всех объектов, которые были полностью созданы + потом segmentation fault (по крайней мере на g++, на других не успел оттестить).

Конечно, хотелось бы найти какой-нибудь механизм, который будет понимать, что именно конструирование объекта завершилось неудачей и исходя из этого вызывать некоторый механизм удаления объекта. Кстати, обычный деструктор здесь не всегда может подойти (особенно когда есть виртуальность и в деструкторе используются виртуальные функции - может получиться так, что деструктор сконструированного базового объекта захочет пользоваться функциями наследуемого, который сконструирован не был). Значит, нужен какой-то особый механизм на статическом связывании. Ладно, придумать его меньшая проблема, чем проблема как отследить исключение и запустить этот механизм... мб статикой? (сча попробую подумать в этом направлении)
...
Рейтинг: 0 / 0
наследование, исключения.
    #34461318
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StepLg пишет:

> 1) объект создается в стэке.
> Если исключение вызывается внутри try блока, то вызываются деструкторы
> для всех объектов, которые были полностью созданы, иначе не вызывается
> ничего.

Ага, а если ислючение вызывается в функции, которая вызывается
из функции, которая вызывается из функции, которая вызызвается
внутри блока try ? И функция эта, самая внутренняя, компилируется
отдельно от всех других модулей ? Нет, что-то вы не то говорите.
А лучше всего найти что написано в стандарте по этому поводу.

> 2) объект создается динамически через new.
> понятное дело, что никакие деструкторы не вызываются.
....
> Конечно, хотелось бы найти какой-нибудь механизм, который будет
> понимать, что именно конструирование объекта завершилось неудачей и
> исходя из этого вызывать некоторый механизм удаления объекта.

Если при создании объекта через new внутри конструкторов
выбросится исключение, то не успеет произойти присваивание адреса
нового объекта переменной, которая должна содержать этот адрес.
И объект просто потеряется. И даже если ты поймешь, что было выброшено
исключение, обработать эту ситуацию невозможно. Потому что нет адреса
объекта. Именно поэтому нормальный компилятор, который работает
по стандарту, должен корректно вызвать все деструкторы объектов, которые
были полностью сконструированы, и после этого освободить память.
Это происходит автоматически и ничего для этого делать не надо.

Вообще, почитайте Меерса (Effective C++ & More effective C++) на эту
тему. Там хорошо все разжевано, и в том числе что надо делать.

Кстати,
> обычный деструктор здесь не всегда может подойти (особенно когда есть

А других нет. Так что и вариантов тоже нет.

> виртуальность и в деструкторе используются виртуальные функции - может
> получиться так, что деструктор сконструированного базового объекта
> захочет пользоваться функциями наследуемого, который сконструирован не
> был).

Такого не бывает в С++.

Значит, нужен какой-то особый механизм на статическом связывании.
> Ладно, придумать его меньшая проблема, чем проблема как отследить

Не надо ничего придумывать. Надо изучать С++ лучше.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
наследование, исключения.
    #34461906
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
StepLg пишет:

> 1) объект создается в стэке.
> Если исключение вызывается внутри try блока, то вызываются деструкторы
> для всех объектов, которые были полностью созданы, иначе не вызывается
> ничего.

Ага, а если ислючение вызывается в функции, которая вызывается
из функции, которая вызывается из функции, которая вызызвается
внутри блока try ? И функция эта, самая внутренняя, компилируется
отдельно от всех других модулей ? Нет, что-то вы не то говорите.
А лучше всего найти что написано в стандарте по этому поводу.

Неудачная фрмулировка. Деструкторы объектов на стеке вызываются в момент прехвата исключения сгенерированного типа. Стандарт по этому поводу наверняка молчит, поскольку если исключение не перехвачено - программа нештатно завершается, а при нештатном завершении никаких гарантий нет. Да и если поставить себя на место разработчиков - каким образом можно реализовать раскрутку стека. То представь себе самое простое и эффективное - имено такое решение, сначала собрал все объекты которые надо удалить, а уж потом удалять
StepLg
> 2) объект создается динамически через new.
> понятное дело, что никакие деструкторы не вызываются.
....
> Конечно, хотелось бы найти какой-нибудь механизм, который будет
> понимать, что именно конструирование объекта завершилось неудачей и
> исходя из этого вызывать некоторый механизм удаления объекта.

Во мечты о сборщике мусора. Ну так найдите себе garbage collector или пишите на java, c#...

StepLg
> обычный деструктор здесь не всегда может подойти (особенно когда есть
> виртуальность и в деструкторе используются виртуальные функции - может
> получиться так, что деструктор сконструированного базового объекта
> захочет пользоваться функциями наследуемого, который сконструирован не
> был).

Это невозмжно, как и вызов виртуальной функции в конструкторе, т.к. объект наследник еще не соэдан или уже помер

StepLg
Значит, нужен какой-то особый механизм на статическом связывании.
> Ладно, придумать его меньшая проблема, чем проблема как отследить

Не надо ничего придумывать. Надо изучать С++ лучше.

И опять мечты о garbage collection
Posted via ActualForum NNTP Server 1.4[/quot]
...
Рейтинг: 0 / 0
наследование, исключения.
    #34462510
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded пишет:

> Неудачная фрмулировка. Деструкторы объектов на стеке вызываются в момент
> прехвата исключения сгенерированного типа.

И в момент выбрасывания. И не только для объектов на стеке.

Стандарт по этому поводу
> наверняка молчит, поскольку если исключение не перехвачено - программа
> нештатно завершается, а при нештатном завершении никаких гарантий нет.

Если не перехвачено вообще ? Но это никогда не известно в данном
контексте выполнения, будет ли перехвачено ислючение выше. Это
невозможно предсказать. Поэтому программа должна работать так, как
будто исключение будет перехвачено.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
наследование, исключения.
    #34462876
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению в момент выбрасывания ничего не разрушается пример - см на скрепке
А вот вывод из него
Код: plaintext
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.
CallNo:  1   // Первый вызов foo
 G()             //Начали строить С(10)
 B()
   A()  0 
   A()  1 
   A()  2 
   A()  3 
   A()  4 
   A()  5 
   A()  6 
   A()  7 
   A()  8 
   A()  9 
C()          // Построили
CallNo:  2   // Вложенный вызов
 G()
 B()
   A()  0 
   A()  1 
   A()  2 
   A()  3 
   A()  4 
   A()  5 
   A()  6 
   A()  7 
   A()  8 
   A()  9 
C()        // еще Раз построили С(10)
 G()      // начали строить С(7)  причем в хипе
 B()
   A()  0 
   A()  1 
   A()  2 
   A()  3 
   A()  4 
   A()  5 
   A()  6 
THROW!!!! // обломались
 ~G()             // развалили папу Но Это мы уже на catch первом уровне? почему - ща поймешь
~C()              // начали разваливать 2-го С(10)
 ~B()
   ~A()  0 
   ~A()  1 
   ~A()  2 
   ~A()  3 
   ~A()  4 
   ~A()  5 
   ~A()  6 
   ~A()  7 
   ~A()  8 
   ~A()  9 
 ~G()       // развалили
 G()         // начали строить  С(7) в хипе на 1-ом уровне
 B()
   A()  0 
   A()  1 
   A()  2 
   A()  3 
   A()  4 
   A()  5 
   A()  6 
THROW!!!!  //Ups,  А дальшие никто наше исключение не перехватил? поэтому ни G - папа C(7) не развалился, ни С(10) 
terminate called after throwing an instance of 'int'
Aborted
Правда забавно?
Ну с объектами в хипе тоже все ясно? развалится если исключение произошло во время его конструированияю
Ну вот наша программа сгенерировала исключение которое никто не перехватил? однако она не работает так как если ничего не былою Ежели ничего не было то объект С(10) должен был бы удалитьсяпри выходе из блока (функции foo)
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / наследование, исключения.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]