![]() |
|
Модераторы: bsa |
![]()
|
|
| Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: нет Всего: 32 |
Здравствуйте !
Допустим у нас есть такая функция:
Чем полох такой подход и как его можно подправить ? P.S. Использовать всякие "прибамбасы" (искуственные обертки) не хочу, т.к. мне не нравиться навязывание ООП в каждом простейшем случае P.P.S. Дважды писать free(pTmp) (для исключения и его отсутствия) - некузяво, ибо вместо free(pTmp) может быть много кода. |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
всем 1. __finally - нет такого в С++, а значит нет гарантии, что это работает нормально. 2. Зачем try если исключение никто не ловит, где catch? а придется, или же Вам лучше не писать на С++, потому что без ООП С++ не нужен. кстати, чем мотивирован выбор malloc\free? |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
ни __try ни __finally в языке С++ нет, а есть try catch...
а для управления памятью лучше использовать идиому RAII |
|||
|
||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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 |
|||
|
||||
| Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: нет Всего: 32 |
Содержательный ответ. Главное: всеобъемлющий
А можно пример, демонстрирующий ненормальную работу ? Или условия, при которых это проявиться ? try нужен для освобождения памяти в любом случае, что бы не случилось в DoAnyThing() catch в данном примере мне не нужен Тем, что я хочу научиться с ними правильно работать. На мой взгляд, это очень веская мотивация Добавлено через 8 минут и 23 секунды Неужели это единственный путь ? Мне он не очень нравиться. Я хочу иметь возможность сама освобождать память тогда, когда мне это надо и именно в том месте, какое мне надо, а не оставлять это усмотрение кого-то |
|||
|
||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
плохо... __try __finaly не работает с типизироваными исключениями, оно может и сработает, но тип исключения ты уже не определишь... память в С++ выделяют с помощью new, так как malloc не вызывает конструкторы объектов... а аналог твоего кода на С++ был бы немного короче... =) Добавлено через 2 минуты и 45 секунд
Добавлено через 7 минут и 21 секунду это нестандартное расширение компилятора vs, оно используется для обработки SEH исключений... |
||||
|
|||||
| Riply |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: нет Всего: 32 |
Плохо в смысле "иж чего захотела" ?
Веский аргумент
Да я вообщем то и не собиралась использовать malloc везде, где только можно Против этого трудно возражать, но за эту краткость мы платим ограничением наших возможностей "командовать парадом" |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Но не надо забывать , что если Вы взяли в свои руки бразды правления , то компилятор умывает руки. А ведь языки высокого уровня прудумали для того , чтоб освободить программиста от ненужной, механической работы, с которой сможет справиться и компьютер. |
|||
|
||||
| Riply |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: нет Всего: 32 |
"Не смею с Вами спорить" (с) Везде, где это возможно я и использую преимущества языка высокого уровня. Но бывают ситуации (хоть и не часто), когда надо покомандовать и самой. Именно из-за них я и создала эту тему. Хочу понять как надо работать в таких случаях.
Раз уж взялись, то придется не забыть |
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
командовать парадом по прежнему возможно, вектор можно передавать в winapi функции, SEH можно преобразовывать в обычные, типизированые исключения... можно делать все что угодно, оставаясь в рамках С++ |
|||
|
||||
| Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: нет Всего: 32 |
Значит мне надо еще учиться, учиться и учиться (как завещал...) ибо пока мне мешает, например, отсутствие finally, хотя я и не сумела составить пример, где эта конструкция работает некорректно. |
|||
|
||||
| Gwendolen |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 5.4.2005 Репутация: нет Всего: 1 |
Про структурную обработку сообщений подробно написано в книге Джеффри Рихтер
а "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows", главы 23-25. --------------------
Наносите пользу и причиняйте добро! |
|||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 2 Всего: 165 |
Зависит от того где приложение выполняется. Если это сервер, то __try вообще нельзя использовать. Серверное Си приложение должно падать быстро в случае ошибки.
Используй RAII и не морочь мозги, а если не хочешь то используй гемморой связанный с отсутствием удобных ООП прибамбасов. Главное что-бы твоя программа в случае критической ошибки не полезла в важные данные и не изменила их ненароком. --------------------
|
|||
|
||||
| vinter |
|
||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
тыц
ты можешь в любой момент удалить smart_pointer сама, если пожелаешь. |
||||
|
|||||
| Riply |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: нет Всего: 32 |
Я не знаю, чем отличается "Серверное Си приложение" от серверного приложеня. Если ничем, то пожалуйста "ссылку в студию" что "__try вообще нельзя использовать" Sorry, если я "заморочила Вам мозги" - не ожидала, что это так легко сделать.
Вы невнимательно читали мои посты. Например, я писала:
А за примером такой ситуации далеко ходить не надо: Как прикажите работать с RtlCreateUnicodeString ? Или при автоматическом удалении структуры UNICODE_STRING компилятор сам догадается, что для буфера необходимо вызвать RtlFreeUnicodeString или, на худой конец RtlFreeHeap, через которую она работает ? Я не вижу другого способа, кроме как обрабатывать данные ситуации вручную. (Надеюсь мне не дадут совет "подправлять" системные структуры а заодно и корректировать работу API
Не поняла какое отношение имеет порча важных данных к обсуждаемой теме. Можно попдробнее ? Это сообщение отредактировал(а) Riply - 2.8.2008, 13:18 |
||||||||
|
|||||||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |