176 / 2 / 1
Регистрация: 31.10.2016
Сообщений: 160
|
||||||
RAII: внутри функции и можно ли в ней заменить new?12.02.2017, 16:05. Показов 1391. Ответов 15
Метки нет Все метки)
(
По наводке Убежденный стал разбираться с RAII, но по мере чтения инфы по сабжу возникают вопросы. Например, как создавать RAII для нескольких функций, требующих закрытия\высвобождения ресурсов? Допустим, хочу проверить является ли пользователь, запускающий мое приложение, администратором, для этого вызываю OpenProcessToken для текущего процесса, тем самым после нам нужно закрыть полученный токен, далее считываю информацию о токене GetTokenInformation: здесь сперва нужно узнать размер буфера для TOKEN_GROUPS, поэтому придется использовать оператор new для выделения нужной памяти (или все же стоит использовать вектор?!); ну и в конце Sid полученный AllocateAndInitializeSid сравниваю с тем, что в группе TOKEN_GROUPS. Псевдокод:
0
|
12.02.2017, 16:05 | |
Ответы с готовыми решениями:
15
Можно ли сделать print внутри функции? Можно ли внутри самого регулярного выражения использовать функции |
Ушел с форума
![]() ![]() |
||
14.02.2017, 15:04 | ||
Я, например, предпочитаю иметь несколько маленьких классов-оберток: auto_handle для HANDLE, auto_free для LocalFree и т.д. Если логика работы с функцией не совсем простая, она вся заворачивается в класс-обертку, а наружу выставляются простые и безопасные методы, которые трудно использовать не по назначению. Если идет работа с буферами, то всяким malloc/new/etc я предпочитаю сразу брать std::vector. И т.д.
0
|
176 / 2 / 1
Регистрация: 31.10.2016
Сообщений: 160
|
|
14.02.2017, 16:41 [ТС] | |
Убежденный, а можно конкретные примеры? То что в Вики лично мне этого мало, чтобы переварить концепцию RAII. Вот как, например, выделить память под некую структуру и если функция вернула length mismatch, как мне увеличить размер вектора?
Где почитать про автохэндл, автофри и так далее? Мне нужны корректные примеры, чтобы понять что к чему.
0
|
Ушел с форума
![]() ![]() |
||||||||||||||||
14.02.2017, 18:07 | ||||||||||||||||
![]() Решение
Обычно я использую примерно следующий подход:
буферы для TOKEN_GROUPS и SID, при выходе из функции или по исключению автоматически освобождаются. Это и есть RAII. Класс auto_handle можно реализовать, например, так:
все равно слишком много низкоуровневых деталей. В большом серьезном проекте я предпочту разработать сначала готовые классы-обертки для работы с ресурсами, а затем использовать их. Получится что-то вроде такого:
А еще проще вызвать CheckTokenMembership и не заморачиваться ![]()
0
|
176 / 2 / 1
Регистрация: 31.10.2016
Сообщений: 160
|
|
14.02.2017, 20:55 [ТС] | |
Про CheckTokenMembership в курсе, здесь речь не столько о нем, сколько попытка на каком-нибудь примере понять суть RAII. С классом автохэндл разобрался, с вектором картина прояснилась, но вот чего никак не пойму зачем порождать исключение, если апишная функция завершилась неудачно. Не проще ли для этих целей использовать __try ... __leave? Ну и все же, можно как-то запилить в функцию RAII сразу для нескольких апишинных функций?
0
|
Ушел с форума
![]() ![]() |
||||
14.02.2017, 21:37 | ||||
Для кода, перфоманс которого не является критичным, исключения банально удобнее (IMHO). Потому что клиентскому коду не требуется писать 150 проверок кодов ошибок. (например, переход в блок __finally при возникновения деления на ноль). И в деструкторе разом все ресурсы освобождай.
0
|
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
|
||||||
16.02.2017, 09:52 | ||||||
![]() Решение
Попробую телепатировать, что подразумевалось под "запилом" RAII в функцию:
1
|
176 / 2 / 1
Регистрация: 31.10.2016
Сообщений: 160
|
|
16.02.2017, 12:31 [ТС] | |
Я это и имел в виду. А насколько корректен будет данный подход с точки высвобождения ресурсов? Убежденный, что скажешь? Можно так?
0
|
Ушел с форума
![]() ![]() |
||
16.02.2017, 16:07 | ||
На выходе из функции sid и т.п. будут очищены.
0
|
176 / 2 / 1
Регистрация: 31.10.2016
Сообщений: 160
|
|
16.02.2017, 19:32 [ТС] | |
Спасибо, ребят!
0
|
176 / 2 / 1
Регистрация: 31.10.2016
Сообщений: 160
|
|
20.09.2017, 12:25 [ТС] | |
Убежденный, а где можно посмотреть примеры классов оберток auto_handle, auto_free и так далее? Можешь поделиться наработками и опытом? Просто тема лично меня очень интересует.
0
|
Ушел с форума
![]() ![]() |
|
20.09.2017, 13:20 | |
К сожалению, не могу привести код именно тех классов, которыми пользуюсь я
(т.к. они часть нашего проекта с закрытыми исходниками), а хотелось бы. Но это все очень легко слепить самому ![]() Пример с auto_handle есть выше, по аналогии пишется все остальное. Можно вообще сделать шаблонные классы с готовыми базовыми функциями, останется только наследоваться от них или написать один раз typedef... На самом деле RAII в виде scope-оберток для каких-то локально используемых ресурсов типа HANDLE - это лишь первый маленький шаг к написанию надежного и безопасного кода. Дальше надо все "сырые" буферы заменить на vector/array/etc, вместо C-строк использовать std::string/QString/CString/etc, поменьше работать с "сырыми" указателями (предпочитая им указатели "умные") и так далее.
1
|
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
|
|||||||||||
20.09.2017, 16:57 | |||||||||||
![]() Решение
jkadaba, я делаю так:
2
|
Ушел с форума
![]() ![]() |
|
20.09.2017, 17:32 | |
jupman, симпатичненько
![]() У меня, кстати, базовые классы тоже лежат в Auto.hpp (совпадение?). Все хорошо, а вот операторы взятия адреса и неявные приведения к типу T я бы убрал, IMHO. От них больше проблем, чем пользы.
1
|
176 / 2 / 1
Регистрация: 31.10.2016
Сообщений: 160
|
||||||
27.09.2017, 11:46 [ТС] | ||||||
jupman, хотел бы отметить твой ответ, но почему-то кнопка с плюсом не срабатывает.
Убежденный, а как быть с аргументами командной строки. В смысле:
0
|
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
|
|||||||||||
27.09.2017, 19:07 | |||||||||||
jkadaba, понимаю, что только изучаете, но что ж Вы так бестолковите? Убежденный уже не раз Вам говорил про векторы и строки. Возьмите, да запихните аргументы в вектор:
0
|
27.09.2017, 19:07 | |
Помогаю со студенческими работами здесь
16
Можно ли внутри клиентской функции изменять серверную переменную? Передача параметров функциям. Можно ли изменить этот параметр внутри функции Можно ли внутри функции f_1 создать массив размера, заданного аргументом n_1? Каким образом можно во внешнем запросе выбрать все переменные, которые находятся внутри функции? Дан указатель: double **p = 0; Выполните следующие задания (решения можно оформлять внутри функции main): Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Опции темы | |
|
Новые блоги и статьи
![]() |
||||
Чем асинхронная логика (схемотехника) лучше тактируемой, как я думаю, что помимо энергоэффективности - ещё и безопасность.
Hrethgir 14.05.2025
Помимо огромного плюса в энергоэффективности, асинхронная логика - тотальный контроль над каждым совершённым тактом, а значит - безусловная безопасность, где безконтрольно не совершится ни одного. . .
|
Многопоточные приложения на C++
bytestream 14.05.2025
C++ всегда был языком, тесно работающим с железом, и потому особеннно эффективным для многопоточного программирования. Стандарт C++11 произвёл революцию, добавив в язык нативную поддержку потоков,. . .
|
Stack, Queue и Hashtable в C#
UnmanagedCoder 14.05.2025
Каждый опытный разработчик наверняка сталкивался с ситуацией, когда невинный на первый взгляд List<T> превращался в узкое горлышко всего приложения. Причина проста: универсальность – это прекрасно,. . .
|
Как использовать OAuth2 со Spring Security в Java
Javaican 14.05.2025
Протокол OAuth2 часто путают с механизмами аутентификации, хотя по сути это протокол авторизации. Представьте, что вместо передачи ключей от всего дома вашему другу, который пришёл полить цветы, вы. . .
|
Анализ текста на Python с NLTK и Spacy
AI_Generated 14.05.2025
NLTK, старожил в мире обработки естественного языка на Python, содержит богатейшую коллекцию алгоритмов и готовых моделей. Эта библиотека отлично подходит для образовательных целей и. . .
|
Реализация DI в PHP
Jason-Webb 13.05.2025
Когда я начинал писать свой первый крупный PHP-проект, моя архитектура напоминала запутаный клубок спагетти. Классы создавали другие классы внутри себя, зависимости жостко прописывались в коде, а о. . .
|
Обработка изображений в реальном времени на C# с OpenCV
stackOverflow 13.05.2025
Объединение библиотеки компьютерного зрения OpenCV с современным языком программирования C# создаёт симбиоз, который открывает доступ к впечатляющему набору возможностей. Ключевое преимущество этого. . .
|
POCO, ACE, Loki и другие продвинутые C++ библиотеки
NullReferenced 13.05.2025
В C++ разработки существует такое обилие библиотек, что порой кажется, будто ты заблудился в дремучем лесу. И среди этого многообразия POCO (Portable Components) – как маяк для тех, кто ищет. . .
|
Паттерны проектирования GoF на C#
UnmanagedCoder 13.05.2025
Вы наверняка сталкивались с ситуациями, когда код разрастается до неприличных размеров, а его поддержка становится настоящим испытанием. Именно в такие моменты на помощь приходят паттерны Gang of. . .
|
Создаем CLI приложение на Python с Prompt Toolkit
py-thonny 13.05.2025
Современные командные интерфейсы давно перестали быть черно-белыми текстовыми программами, которые многие помнят по старым операционным системам. CLI сегодня – это мощные, интуитивные и даже. . .
|