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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> __try, __finally, отрицательные стороны использования 
:(
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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