Модераторы: 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   Вверх
Rififi
Дата 2.8.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 3
Всего: 36



Но бывают ситуации (хоть и не часто), когда надо покомандовать и самой.

Цитата
So... are you going to kill me?
Think you can?

(с) Ultraviolet

:gigi:

Это сообщение отредактировал(а) Rififi - 2.8.2008, 13:20
PM MAIL   Вверх
Lazin
Дата 2.8.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Riply @  2.8.2008,  13:17 Найти цитируемый пост)
Если ничем, то пожалуйста "ссылку в студию" что  "__try вообще нельзя использовать"

В программах на С++ объекты имеют деструкторы, а механизм __try __finaly о них ничего не знает, и соответственно не вызывает. Это разве не аргумент? smile 

Цитата(Riply @  2.8.2008,  13:17 Найти цитируемый пост)
Как прикажите работать с RtlCreateUnicodeString ?
Или при автоматическом удалении структуры UNICODE_STRING компилятор сам догадается, 
что для буфера необходимо вызвать RtlFreeUnicodeString или, на худой конец RtlFreeHeap,
через которую она работает ?

написать класс RtlUnicodeString smile 
PM MAIL Skype GTalk   Вверх
mes
Дата 2.8.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Riply @  2.8.2008,  13:17 Найти цитируемый пост)
Я не вижу другого способа, кроме как обрабатывать данные ситуации вручную.

создаешь wrapper и он все сделает сам : проинициализирует данные /буффер  в конструкторе и удалит его в деструкторе..






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


Эксперт
****


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

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



Цитата(Riply @  2.8.2008,  13:17 Найти цитируемый пост)
Или при автоматическом удалении структуры UNICODE_STRING компилятор сам догадается, 
что для буфера необходимо вызвать RtlFreeUnicodeString или, на худой конец RtlFreeHeap,
через которую она работает ?
Я не вижу другого способа, кроме как обрабатывать данные ситуации вручную.

если мне не изменяет память, boost::shared_ptr имеет возможность указать какую-то свою функцию, которая будет использована вместо delete, в данном случае RtlFreeUnicodeString

т.е. будет что-то типа
Код

shared_ptr p(указатель на строку,RtlFreeUnicodeString);



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


Опытный
**


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

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



Цитата(vinter @  2.8.2008,  09:36 Найти цитируемый пост)
тыц


Спасибо, хорошая ссылка.
P.S. А что такое "тыц" ?

Цитата(Lazin @  2.8.2008,  15:17 Найти цитируемый пост)
В программах на С++ объекты имеют деструкторы, а механизм __try __finaly о них ничего не знает, и соответственно не вызывает. Это разве не аргумент?


Аргумент. Но аргумент, что неудобно использовать а не "вообще нельзя"  smile 

Цитата(Lazin @  2.8.2008,  15:17 Найти цитируемый пост)
написать класс RtlUnicodeString 


Это серьезно или так принято посмеиваться над новичками ?  smile 
Неужели для каждой подобной стуктуры ( ситуации ) надо писть свою обертку ?

Цитата(mes @  2.8.2008,  18:03 Найти цитируемый пост)
создаешь wrapper и он все сделает сам : проинициализирует данные /буффер  в конструкторе и удалит его в деструкторе..


Те же вопросы, что и к Lazin

Цитата(maxim1000 @  2.8.2008,  18:16 Найти цитируемый пост)
если мне не изменяет память, boost::shared_ptr имеет возможность указать какую-то свою функцию, которая будет использована вместо delete, в данном случае RtlFreeUnicodeString


Если они это (boost::shared_ptr) действительно умеют вызывать вместо delete нужную ф-ию , 
то это может оказаться выходом. (На первый взгяд. Очень на то похоже smile)

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


Explorer
****


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

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



Цитата(Riply @  2.8.2008,  20:35 Найти цитируемый пост)
Если они это (boost::shared_ptr) действительно умеют

действительно умеют
Цитата(Riply @  2.8.2008,  20:35 Найти цитируемый пост)
Аргумент. Но аргумент, что неудобно использовать а не "вообще нельзя"   

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

Цитата(Riply @  2.8.2008,  20:35 Найти цитируемый пост)
P.S. А что такое "тыц" ?

ниче, просто ссылка smile


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


Опытный
**


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

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



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


Убедительно. 
Но все же хотелось бы найти возможность и самой покомандовать smile

Цитата(vinter @  2.8.2008,  20:03 Найти цитируемый пост)
действительно умеют


Я тут чуть подумала, насчет этого - не все так просто.
Дело в том, что наш объект может быть "инициализирован" разными способами.
И этих способов довольно много.
От RtlCreateUnicodeString - один вариант финализации, до  RtlInitUnicodeString - другой (нельзя освобождать буфер).
Плюс к этому, придется учитывать, что на протяжении своей жизни,
наш конкректный объект может менять эти способы как перчатки smile
 (что вообщем то довольно часто и происходит)

Ну и в довесок: сейчас мы говорим о UNICODE_STRING
а как быть с другими (подобными) объектами ?
Может, лучше попробовать найти "валидный" способ самой поуправлять этим делом smile

P.S.
 Неужели от __try __finaly придется отказаться ? 




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


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


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

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



Цитата(Riply @  2.8.2008,  19:35 Найти цитируемый пост)
Аргумент. Но аргумент, что неудобно использовать а не "вообще нельзя"   

В данном случае аргумент надо расценивать "нельзя вобше"  потому что деструктор така же важная деталь как и конструктор.
Потому что вначале отладите программу под плоские типы а потом замените на неплоский и долго долго будете искать где теряется память ))


Цитата(Riply @  2.8.2008,  19:35 Найти цитируемый пост)
Неужели для каждой подобной стуктуры ( ситуации ) надо писть свою обертку ?

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

Цитата(Riply @  2.8.2008,  20:44 Найти цитируемый пост)
Может, лучше попробовать найти "валидный" способ самой поуправлять этим делом 

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

Добавлено через 4 минуты и 59 секунд
Мне кажется,  что у Вас несколько процедурный взгляд на программирование (сорри если что не так сказал). В ООП программа не должна быть завязана на реализации - благодаря этому ее удобно развивать и поддерживать  smile 

Это сообщение отредактировал(а) mes - 2.8.2008, 21:19


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


Эксперт
****


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

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



Цитата(Riply @  2.8.2008,  19:35 Найти цитируемый пост)
Это серьезно или так принято посмеиваться над новичками ?  smile 
Неужели для каждой подобной стуктуры ( ситуации ) надо писть свою обертку ?

для этого есть шаблоны
Код

#include <iostream>

void Initialize(void* data)
{
    std::cout << data << " initialized" << std::endl;
}

void Finalize(void* data)
{
    std::cout << data << " finalized" << std::endl;
}


template <class Param, void (*Init)(Param*), void (*Free)(Param*)>
class init_free_helper_t
{
    Param *param;
    public:
    init_free_helper_t(Param* p) : param(p) 
    {
        Init(param);
    }
    ~init_free_helper_t() 
    {
        Free(param);
    }
};

int main()
{
    typedef init_free_helper_t<void, Initialize, Finalize> wrapper;
    void* data = (void*)1234;
    wrapper w(data);
}

если использвать boost::function и boost::bind то можно сделать еще более гибко, для функций с разным набором параметров..
можно для этого просто использовать boost::shared_ptr...
Цитата(Riply @  2.8.2008,  20:44 Найти цитируемый пост)
Неужели от __try __finaly придется отказаться ? 

несомненно, либо писать на чистом Си
PM MAIL Skype GTalk   Вверх
Riply
Дата 3.8.2008, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  2.8.2008,  21:18 Найти цитируемый пост)
Мне кажется,  что у Вас несколько процедурный взгляд на программирование 


Мой "взгляд на программирование" зависит от задачи стоящий передо мной
в данный момент времени.
Сейчас (сегодня) у меня действительно "процедурный взгляд".
Будет другая задача и он тут же изменится ( как у политиков   smile smile



Цитата(Lazin @  2.8.2008,  22:03 Найти цитируемый пост)
для этого есть шаблоны


Спасибо, большое !

vinter, 
Примеры, приведенные в "тыц", на мой взгляд не совсем "честные" smile
Дело в том, что там смешиваются два типа обработки исключений.
Если Builder и пропускает это безобразие при компиляции, 
то VS уже кричит во всю глотку: "only one form of exception handling permitted per function". smile
А то что Builder пропускает - не означает, что код "синтаксически код верен и вполне законен" (с) из "тыц".
ибо не все, что проглатывает компилятор - верно smile
Рихтер, например, предупреждает, что не стоит путать SEH с обработкой исключений в C++.

Добавлено через 3 минуты и 45 секунд
P.S.
 Забыла сказать, что у меня в этих примерах, все блоки finally выполняются корректно.
 Может другая версия Builder`а.
PM MAIL   Вверх
vinter
Дата 3.8.2008, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(Riply @  3.8.2008,  09:41 Найти цитируемый пост)
P.S. Забыла сказать, что у меня в этих примерах, все блоки finally выполняются корректно. Может другая версия Builder`а.

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


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


Эксперт
****


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

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



Цитата(Riply @  2.8.2008,  20:44 Найти цитируемый пост)
От RtlCreateUnicodeString - один вариант финализации, до  RtlInitUnicodeString - другой (нельзя освобождать буфер).
Плюс к этому, придется учитывать, что на протяжении своей жизни,
наш конкректный объект может менять эти способы как перчатки smile
 (что вообщем то довольно часто и происходит)


ИМХО, на ООП стоит смотреть не как на средство сокрытия каких-то данных или создания больших и непонятных иерархий, а как на способ выбора места, где в программе расположить то или иное знание

если, например, у нас будет какой-то алгоритм рбаоты с такими строками, выполняющий какую-то свою, возможно, сложную задачу, то в большинстве случаев довольно неудобно вмешивать туда ещё и эту логику - тогда его станет сложнее писать и значительно сложнее править баги

создание отдельного класса позволяет не сколько скрыть, сколько локализовать все эти знания о том, как нужно финализировать объект в разных ситуациях


--------------------
qqq
PM WWW   Вверх
mes
Дата 4.8.2008, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(maxim1000 @  3.8.2008,  23:26 Найти цитируемый пост)
не сколько скрыть, сколько локализовать все эти знания о том, как нужно... 

 smile 

Это сообщение отредактировал(а) mes - 4.8.2008, 00:05


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


Inspired =)
***


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

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



Riply, в аттаче Вам хорошая статья про SEH smile 

Присоединённый файл ( Кол-во скачиваний: 23 )
Присоединённый файл  SEH.rar 253,66 Kb


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Riply
Дата 5.8.2008, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(maxim1000 @  3.8.2008,  23:26 Найти цитируемый пост)
создание отдельного класса позволяет не сколько скрыть, сколько локализовать все эти знания о том, как нужно финализировать объект в разных ситуациях 


Сложно не согласиться smile

Цитата(Rrader @  4.8.2008,  15:53 Найти цитируемый пост)
Riply, в аттаче Вам хорошая статья про SEH 


А ведь действительно хорошая smile
IMHO, отвечает на некоторые вопросы, которым Рихтер не счел нужным уделить внимание.
Спасибо.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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