Описание тега raii
Приобретение ресурсов - это инициализация (RAII) - это распространенная идиома, используемая в C++ для управления временем жизни ресурсов, включая выделение памяти, дескрипторы файлов или подключения к базе данных. Короче говоря, каждый ресурс должен быть заключен в класс-владелец, время жизни которого контролирует время жизни ресурса.
3
ответа
Когда целесообразно использовать исключения C++?
Я пытаюсь создать класс, который должен динамически выделять часть памяти.. Я планировал выделить память, которая ей нужна во время создания, но как мне справиться с неудачным выделением памяти? Должен ли я бросить исключение? Я где-то читал, что ис…
25 фев '09 в 03:27
2
ответа
C++ и Qt: это утечка памяти? (и общие вопросы)
Я в основном использовал C для программирования в последние 2 года (ранее немного на Java) и решил изучать C++, используя Qt Creator и библиотеки Qt. Мой вопрос заключается в том, представляет ли следующий код утечку памяти: // filename is a QString…
04 дек '11 в 14:11
5
ответов
Получение shared_ptr для вызова функции-члена, когда ее счетчик ссылок достигнет 0
Я создаю оболочку для HANDLE, которая не работает с DuplicateHandle, поэтому вместо этого я пытаюсь обернуть ручку в shared_ptr. Представьте себе следующий код: class CWrapper { public: CWrapper() : m_pHandle(new HANDLE, &CWrapper::Close) { //co…
20 июн '10 в 11:48
1
ответ
Передача указателя владения исключение безопасно
У меня есть ситуация, когда передача владения необработанным указателем может вызвать исключение. Есть несколько таких блоков, и было бы неправильно обернуть каждый в try / catch просто для удаления указателей, которые не были приняты. Вместо этого …
02 окт '15 в 00:33
3
ответа
Есть ли у частного нового оператора неожиданные побочные эффекты?
В этом блоге я читал, что закрытие нового оператора является хорошим подходом для принудительного создания экземпляра в стеке. Я реализую класс, который использует идиому RAII. Этот класс, очевидно, должен создаваться только в стеке, поэтому я ищу с…
14 май '11 в 10:56
2
ответа
Время жизни членов класса C++
Каково время жизни члена класса C++. Например, когда std::fstream из Foo объект будет выпущен? При входе в деструктор или при выходе из деструктора? Это определено в стандарте C++? struct Foo { std::fstream mystream; ~Foo() { // wait for thread writ…
06 окт '12 в 22:05
4
ответа
Это плохой дизайн RAII?
Я имею опыт работы с Java, но позже изучил C++ и программирую на нем уже несколько лет (в основном это отладка и написание исправлений, а не разработка программ с нуля). Тем не менее, я столкнулся с проблемой сегодня и, честно говоря, я немного удив…
13 сен '12 в 17:00
1
ответ
Есть ли риск в оболочке AutoCloseable для java.util.concurrent.locks.Lock?
С try-with-resource Введенный в Java 7, я был удивлен, увидев, что Lock не был дооснащен, чтобы быть AutoCloseable, Казалось, довольно просто, поэтому я сам добавил это следующим образом: class Lock implements AutoCloseable { private final java.util…
15 май '13 в 20:26
2
ответа
Как добавить объект с дорогим dtor в вектор без emplace_back()
У меня есть объект RenderBuffer это создает буфер OpenGL как часть его конструктора и уничтожает его как часть его деструктора. Это очень дорогая операция. Этот объект не имеет конструктора по умолчанию, поэтому он обычно либо помещается в список ин…
06 сен '16 в 17:15
2
ответа
Прочитать файл, используя C++ и RAII
Какой лучший способ прочитать файл с использованием C++ и RAII? Все примеры, которые я видел, используют что-то похожее на код ниже: #include <iostream> #include <fstream> int main () { std::ifstream is ("test.txt", std::ifstream::binary…
02 июн '14 в 07:27
8
ответов
RAII против исключений
Чем больше мы используем RAII в C++, тем больше мы оказываемся с деструкторами, которые делают нетривиальное освобождение. Теперь освобождение (завершение, как бы вы его ни называли) может завершиться неудачей, и в этом случае исключения действитель…
01 окт '08 в 19:14
2
ответа
Как реализовать RAII типа API CUDA cudaEvent_t с помощью shared_ptr
API CUDA имеет типы, которые требуют вызовов create() и destroy(), аналогичных выделению памяти new и delete. В духе RAII, и вместо того, чтобы вызывать cudaEventCreate( &event;) и cudaEventDestory( event), я написал следующую оболочку для cudaEvent…
21 фев '18 в 11:21
1
ответ
Почему RAII так назван?
Смысл, который я получаю об этой идиоме, состоит в том, что она полезна, потому что она гарантирует, что ресурсы высвобождаются после того, как объект, который их использует, выходит из области видимости. Другими словами, это больше о де-захвате и д…
10 апр '12 в 19:31
2
ответа
Сами лямбды C++11 подвергаются автоматическому освобождению RAII?
Я хотел бы написать метод класса, который по выбору принимает лямбду, чтобы настроить его поведение. Поэтому при использовании этого класса мне интересно, нужно ли мне беспокоиться о том, что сама лямбда выходит из области видимости? Лямбда не будет…
13 ноя '13 в 18:28
4
ответа
Деструктор может выполнять различные действия в зависимости от того, произошло ли исключение
У меня есть код для обновления таблицы базы данных, которая выглядит как try { db.execute("BEGIN"); // Lots of DELETE and INSERT db.execute("COMMIT"); } catch (DBException&) { db.execute("ROLLBACK"); } Я хотел бы обернуть логику транзакции в кла…
09 апр '10 в 07:02
1
ответ
Как я должен обернуть библиотеки C в C++
Типичные библиотеки C выглядят так: foo_t * foo_open(); int foo_query( foo_t * ); int foo_close( foo_t * ); Я вижу два способа обернуть их в изящные структуры RAII. Я мог бы либо создать класс и обернуть каждую функцию C: class foo { public: foo(): …
24 мар '14 в 10:32
1
ответ
C++ новое выделение массива C, RAII или простой shared_ptr / boost::shared_array
Я изучаю с ++, и я наткнулся еще раз на новую проблему. Мне нужно выделить массив C для библиотеки для использования, но безопасным способом, конечно. Я уже обнаружил, что delete[]; в конце метод с треском проваливается. СТАРЫЙ, не очень хорошо floa…
24 дек '14 в 00:01
5
ответов
Когда использовать объект в векторе, а когда указатель на объект в векторе?
Когда вы создаете объекты и сохраняете их в векторе. Каковы плюсы и минусы между этими тремя и в каком случае их следует использовать? Объект: std::vector<obj> collection; collection.push_back(obj{}); Указатель на объект: std::vector<obj*&g…
17 сен '14 в 08:27
1
ответ
Код очистки в деструкторе исключения C++
Можем ли мы использовать деструктор исключения как место для размещения некоторого кода очистки? Таким образом, мы можем позволить клиенту контролировать этап завершения в отличие от RAII. Это хороший или плохой дизайн? Это правильное решение в конт…
21 фев '12 в 13:54
1
ответ
Архитектура raii с использованием C++ и glfw
В настоящее время я пытаюсь написать небольшой движок на C++, используя glfw для создания окон. Я хочу активно использовать raii, чтобы создать архитектуру, исключающую исключительные ситуации, и сделать движок практически невозможным для неправильн…
26 янв '18 в 10:33