powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Кнструктор и деструктор throw Exception
10 сообщений из 10, страница 1 из 1
Кнструктор и деструктор throw Exception
    #33033409
Местный писатель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Класс :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
class TClass1: public TObject
{
private:    
public:
	// Контруктор
	__fastcall TClass1();
        // Деструктор
	virtual __fastcall ~TClass1();
};
Кнструктор и деструктор :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
//---------------------------------------------------------------------------
__fastcall TClass1::TClass1()
{
 try
 { throw Exception("!!!");
 }
 catch (Exception *E)
 { delete this;
 }
}
//---------------------------------------------------------------------------
__fastcall TClass1::~TClass1()
{
  // какие-то действия
}
//---------------------------------------------------------------------------


TClass1 наследник TObject , на конструкторе TClass1 произходит ecxeption, после вызывается десируктор ...
Вопрос: Если я создам обьект класса TClass1 (TClass1 *Class1 = new TClass1 )
Class1 - все равно будет хранить какую-то ссылку, не смотря на то что десируктор уже отработал (delete this). Как понять , что Class1 уже уничтожен, ведь он хранит ссылку ???
...
Рейтинг: 0 / 0
Кнструктор и деструктор throw Exception
    #33033490
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Местный писательКласс :
TClass1 наследник TObject , на конструкторе TClass1 произходит ecxeption, после вызывается десируктор ...
Вопрос: Если я создам обьект класса TClass1 (TClass1 *Class1 = new TClass1 )
Class1 - все равно будет хранить какую-то ссылку, не смотря на то что
десируктор уже отработал (delete this).


Не будет он хранить ссылку. До операции присваивания дело не дойдет.
...
Рейтинг: 0 / 0
Кнструктор и деструктор throw Exception
    #33033512
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Кнструктор и деструктор throw Exception
    #33033526
Местный писатель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Не будет он хранить ссылку. До операции присваивания дело не дойдет.

Понял !
У меня TClass1 *Class1 обьявлен как глобальный (extern PACKAGE TSendOutLookMsg *SendOutLookMsg;)
вот и хранится там ссылка ... не надо его обьявлять как глобальный .
Спасиб ...
...
Рейтинг: 0 / 0
Кнструктор и деструктор throw Exception
    #33033548
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, если ты хотел этот exception, который выбрасывается здесь :
try
{ throw Exception("!!!");
}

поймать здесь :
catch (Exception *E)
{ delete this;
}

, то так ты его не поймаешь .

Кстати - 2 : Этого вообще делать не нужно, поскольку в случае возникновения исключения в конструкторе язык (С++) сам обеспечивает и вызовы деструкторов, и удаление памяти.

Самое главное, (кстати-3) что ты НЕ МОЖЕШЬ сказать delete this; в конструкторе, во-первых, поскольку ты не знаешь, как объект this создан, а во-вторых, что в данном случае более важно, объект this еще не сконструирован доконца .
...
Рейтинг: 0 / 0
Кнструктор и деструктор throw Exception
    #33033595
Местный писатель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivКстати, если ты хотел этот exception, который выбрасывается здесь :
try
{ throw Exception("!!!");
}

поймать здесь :
catch (Exception *E)
{ delete this;
}

, то так ты его не поймаешь .

Кстати - 2 : Этого вообще делать не нужно, поскольку в случае возникновения исключения в конструкторе язык (С++) сам обеспечивает и вызовы деструкторов, и удаление памяти.

Самое главное, (кстати-3) что ты НЕ МОЖЕШЬ сказать delete this; в конструкторе, во-первых, поскольку ты не знаешь, как объект this создан, а во-вторых, что в данном случае более важно, объект this еще не сконструирован доконца .

1 - ое кстати - проверял ловит !
2 - ое ктати - без try .. catch() - прозходит что-то не очень понятное, диструктор не вызывается, а программа просто вылетает
3 - е кстати - можно ли вызвать delete this на виртуальном методе AfterConstruction ???
...
Рейтинг: 0 / 0
Кнструктор и деструктор throw Exception
    #33033654
Местный писатель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Не будет он хранить ссылку. До операции присваивания дело не дойдет.

Сейчас проверил , до присвоения дело дошло !!!
Видимо придется проверять валидность ссылки !
...
Рейтинг: 0 / 0
Кнструктор и деструктор throw Exception
    #33045197
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это какай же у тебя компилятор ?
...
Рейтинг: 0 / 0
Кнструктор и деструктор throw Exception
    #33045543
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
1) если исключение возникло в теле контруктора, то деструктор объекта не будет вызван, потому что класс не создан, но будут вызваны деструкторы членов класса и предтков, которые успели собраться. Далее если исключение возникло при инициализации членов класса или предков - то до тела конструктора дело не дойдет и не дойдет дело и до вашего try catch, поэтому кстати был добавлен в стандарт try catch на конструктор ВЕСЬ, но его кажись уже никто и не поддерживает. Это какой-то жуткий "муветон".

2) this в теле конструктора имхо ИНОГДА можно использовать, его нельзя использовать в списке инициализации. В часности когда необходимо разрешить конфликт имен. Там просто много НО они описаны в Стандарте 12.6.2 - там все про конструкторы и списки инициализации. В частности для const объектов использование this будет неопределено. Но если уж вспоминать Стандарт то он дпускает использование this для доступа в к членам ДАЖЕ в СПИСКЕ ИНИЦИАЛИЗАЦИИ
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
class X{
 int a;
 int b;
 int i;
 int j;
public:
 const int& r;
 X(int i) : r(a), b(i), i(i), j(this->i) {}
};

и далее черным по белому написано because the mem-initializer are evaluated in the scope of constructor, the this pointer can be used in the expression-list of a mem-initializer to refer to the object being initilized. (12.6.2.8)
...
Рейтинг: 0 / 0
Кнструктор и деструктор throw Exception
    #33045558
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
Это скорее даже не компилятор - это автор неверно ловит исключения снаружи. Или делает неверные выводы.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Кнструктор и деструктор throw Exception
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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