Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> __try, __finally, отрицательные стороны использования 
:(
    Опции темы
Riply
Дата 1.8.2008, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Здравствуйте !
Допустим у нас есть такая функция:
Код

int MySuperPuperFunction(void)
{
  void * pTmp = malloc(AnySize);
  __try
   {
     DoAnyThing();
   }
  __finally
   {
     free(pTmp); 
   };

  DoAnyThing1();

  return 0;
};

Чем полох такой подход и как его можно подправить ?
P.S.
Использовать всякие "прибамбасы" (искуственные обертки) не хочу, т.к.
мне не нравиться навязывание ООП в каждом простейшем случае smile
P.P.S.
 Дважды писать free(pTmp) (для исключения и его отсутствия) - некузяво,
 ибо вместо free(pTmp) может быть много кода.

PM MAIL   Вверх
vinter
Дата 1.8.2008, 20:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(Riply @  1.8.2008,  21:19 Найти цитируемый пост)
Чем полох такой подход и как его можно подправить ?

всем
1. __finally -  нет такого в С++, а значит нет гарантии, что это работает нормально.
2. Зачем try если исключение никто не ловит, где catch?
Цитата(Riply @  1.8.2008,  21:19 Найти цитируемый пост)
мне не нравиться навязывание ООП в каждом простейшем случае

а придется, или же Вам лучше не писать на С++, потому что без ООП  С++ не нужен.
кстати, чем мотивирован выбор malloc\free?


--------------------
Мой блог
PM MAIL WWW   Вверх
Lazin
Дата 1.8.2008, 21:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



ни __try ни  __finally в языке С++ нет, а есть try catch...

а для управления памятью лучше использовать идиому RAII
PM MAIL Skype GTalk   Вверх
Sartorius
Дата 1.8.2008, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 2
Всего: 37



vinter, 
Lazin, 
 Уважаемая Riply забыла видимо сказать, что речь идет о managed с++, где __finally есть
http://msdn.microsoft.com/en-us/library/df24ysb6(VS.71).aspx

ЗЫ __finally возможно есть и в нативных компиляторах реализующих SEH

PM MAIL ICQ   Вверх
Riply
Дата 1.8.2008, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Цитата(vinter @  1.8.2008,  20:47 Найти цитируемый пост)
всем

Содержательный ответ. Главное: всеобъемлющий smile


Цитата(vinter @  1.8.2008,  20:47 Найти цитируемый пост)
1. __finally -  нет такого в С++, а значит нет гарантии, что это работает нормально

А можно пример, демонстрирующий ненормальную работу ?
Или условия, при которых это проявиться ?

Цитата(vinter @  1.8.2008,  20:47 Найти цитируемый пост)
2. Зачем try если исключение никто не ловит, где catch?

try нужен для освобождения памяти в любом случае, что бы не случилось в DoAnyThing()

catch в данном примере мне не нужен


Цитата(vinter @  1.8.2008,  20:47 Найти цитируемый пост)
кстати, чем мотивирован выбор malloc\free? 

Тем, что я хочу научиться с ними правильно работать.
На мой взгляд, это очень веская мотивация smile

Добавлено через 8 минут и 23 секунды
Цитата(Lazin @  1.8.2008,  21:05 Найти цитируемый пост)
а для управления памятью лучше использовать идиому RAII


Неужели это единственный путь ? 
Мне он не очень нравиться.
Я хочу иметь возможность сама освобождать память тогда, когда мне это надо и 
именно в том месте, какое мне надо, а не оставлять это усмотрение кого-то smile
PM MAIL   Вверх
Lazin
Дата 1.8.2008, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



Цитата(Riply @  1.8.2008,  21:23 Найти цитируемый пост)
Я хочу иметь возможность сама освобождать память тогда, когда мне это надо и 
именно в том месте, какое мне надо, а не оставлять это усмотрение кого-то

плохо... 
__try __finaly не работает с типизироваными исключениями, оно может и сработает, но тип исключения ты уже не определишь...
память в С++ выделяют с помощью new, так как malloc не вызывает конструкторы объектов...
а аналог твоего кода на С++ был бы немного короче... =)

Добавлено через 2 минуты и 45 секунд
Код

int MySuperPuperFunction(void)
{
  std::vector<char> data(AnySize);
  try
  { 
     DoAnyThing();
  } catch (...) {}
  DoAnyThing1();
  return 0;
};
 smile

Добавлено через 7 минут и 21 секунду
Цитата(Sartorius @  1.8.2008,  21:15 Найти цитируемый пост)
managed с++

это нестандартное расширение компилятора vs, оно используется для обработки SEH исключений...
PM MAIL Skype GTalk   Вверх
Riply
Дата 1.8.2008, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Цитата(Lazin @  1.8.2008,  21:57 Найти цитируемый пост)
плохо... 


Плохо в смысле "иж чего захотела" ? smile

Цитата(Lazin @  1.8.2008,  21:57 Найти цитируемый пост)
__try __finaly не работает с типизироваными исключениями, оно может и сработает, но тип исключения ты уже не определишь


Веский аргумент

Цитата(Lazin @  1.8.2008,  21:57 Найти цитируемый пост)
память в С++ выделяют с помощью new, так как malloc не вызывает конструкторы объектов...


Да я вообщем то и не собиралась использовать malloc везде, где только можно smile

Цитата(Lazin @  1.8.2008,  21:57 Найти цитируемый пост)
а аналог твоего кода на С++ был бы немного короче... =)

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

PM MAIL   Вверх
mes
Дата 1.8.2008, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Riply @  1.8.2008,  22:25 Найти цитируемый пост)
Против этого трудно возражать, но за эту краткость
мы платим ограничением наших возможностей "командовать парадом" smile


Но  не надо забывать , что если Вы взяли в свои руки бразды правления , то компилятор умывает руки.
А ведь языки высокого уровня  прудумали для того , чтоб освободить программиста от ненужной, механической работы,
с которой сможет справиться и компьютер.


--------------------
PM MAIL WWW   Вверх
Riply
Дата 1.8.2008, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Цитата(mes @  1.8.2008,  22:59 Найти цитируемый пост)
А ведь языки высокого уровня  прудумали для того , чтоб освободить программиста от ненужной, механической работы,
с которой сможет справиться и компьютер. 


"Не смею с Вами спорить" (с)  smile

Везде, где это возможно я и использую преимущества языка высокого уровня.
Но бывают ситуации (хоть и не часто), когда надо покомандовать и самой.
Именно из-за них я и создала эту тему.
Хочу понять как надо работать в таких случаях.

Цитата(mes @  1.8.2008,  22:59 Найти цитируемый пост)
Но  не надо забывать , что если Вы взяли в свои руки бразды правления , то компилятор умывает руки.

Раз уж взялись, то придется не забыть smile

PM MAIL   Вверх
Lazin
Дата 1.8.2008, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



Цитата(Riply @  1.8.2008,  22:25 Найти цитируемый пост)
за эту краткость
мы платим ограничением наших возможностей "командовать парадом"

командовать парадом по прежнему возможно, вектор можно передавать в winapi функции, SEH можно преобразовывать в обычные, типизированые исключения... можно делать все что угодно, оставаясь в рамках С++ smile 
PM MAIL Skype GTalk   Вверх
Riply
Дата 1.8.2008, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Цитата(Lazin @  1.8.2008,  23:15 Найти цитируемый пост)
командовать парадом по прежнему возможно, вектор можно передавать в winapi функции, SEH можно преобразовывать в обычные, типизированые исключения... можно делать все что угодно, оставаясь в рамках С++ 


Значит мне надо еще учиться, учиться и учиться (как завещал...)  smile 
ибо пока мне мешает, например, отсутствие finally,
хотя я и не сумела составить пример, где эта конструкция работает некорректно.

PM MAIL   Вверх
Gwendolen
Дата 2.8.2008, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 5.4.2005

Репутация: нет
Всего: 1



Про структурную обработку сообщений подробно написано в книге Джеффри Рихтер
а "Создание эффективных WIN32-приложений
с учетом специфики 64-разрядной версии Windows", главы 23-25.
--------------------
Наносите пользу и причиняйте добро!
PM MAIL   Вверх
chipset
Дата 2.8.2008, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 2
Всего: 165



Зависит от того где приложение выполняется. Если это сервер, то __try вообще нельзя использовать. Серверное Си приложение должно падать быстро в случае ошибки.
Используй RAII и не морочь мозги, а если не хочешь то используй гемморой связанный с отсутствием удобных ООП прибамбасов. Главное что-бы твоя программа в случае критической ошибки не полезла в важные данные и не изменила их ненароком.


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
vinter
Дата 2.8.2008, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(Riply @  2.8.2008,  00:54 Найти цитируемый пост)
хотя я и не сумела составить пример, где эта конструкция работает некорректно.

тыц

Цитата(Riply @  1.8.2008,  22:23 Найти цитируемый пост)
Я хочу иметь возможность сама освобождать память тогда, когда мне это надо

ты можешь в любой момент удалить smart_pointer сама, если пожелаешь. 


--------------------
Мой блог
PM MAIL WWW   Вверх
Riply
Дата 2.8.2008, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Цитата(chipset @  2.8.2008,  09:03 Найти цитируемый пост)
Зависит от того где приложение выполняется. Если это сервер, то __try вообще нельзя использовать. Серверное Си приложение должно падать быстро в случае ошибки.


Я не знаю, чем отличается "Серверное Си приложение"  от серверного приложеня.  smile 
Если ничем, то пожалуйста "ссылку в студию" что  "__try вообще нельзя использовать"

 
Цитата(chipset @  2.8.2008,  09:03 Найти цитируемый пост)
Используй RAII и не морочь мозги


Sorry, если я "заморочила Вам мозги" - не ожидала, что это так легко сделать. smile

Цитата(chipset @  2.8.2008,  09:03 Найти цитируемый пост)
если не хочешь то используй гемморой связанный с отсутствием удобных ООП прибамбасов


Вы невнимательно читали мои посты.
Например, я писала:
Цитата(Riply @  1.8.2008,  23:10 Найти цитируемый пост)
Везде, где это возможно я и использую преимущества языка высокого уровня.
Но бывают ситуации (хоть и не часто), когда надо покомандовать и самой.

А за примером такой ситуации далеко ходить не надо:
Как прикажите работать с RtlCreateUnicodeString ?
Или при автоматическом удалении структуры UNICODE_STRING компилятор сам догадается, 
что для буфера необходимо вызвать RtlFreeUnicodeString или, на худой конец RtlFreeHeap,
через которую она работает ?
Я не вижу другого способа, кроме как обрабатывать данные ситуации вручную.
(Надеюсь мне не дадут совет "подправлять" системные структуры а заодно и корректировать работу API  smile )

Цитата(chipset @  2.8.2008,  09:03 Найти цитируемый пост)
Главное что-бы твоя программа в случае критической ошибки не полезла в важные данные и не изменила их ненароком. 

Не поняла какое отношение имеет порча важных данных к обсуждаемой теме.
Можно попдробнее ?


Это сообщение отредактировал(а) Riply - 2.8.2008, 13:18
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0732 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.