|
176 / 2 / 1
Регистрация: 31.10.2016
Сообщений: 160
|
||||||
RAII: внутри функции и можно ли в ней заменить new?12.02.2017, 16:05. Показов 1524. Ответов 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 | ||||||||||||||||
Сообщение было отмечено jkadaba как решение
Решение
Обычно я использую примерно следующий подход:
буферы для 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 | ||||||
Сообщение было отмечено jkadaba как решение
Решение
Попробую телепатировать, что подразумевалось под "запилом" 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 как решение
Решение
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): Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|