2014-01-20 5 views
0

Итак, если я правильно понимаю, точка RAII - это устранение проблем управления памятью. То есть вы удаляете деструктор объекта. Таким образом, когда указатель выходит из области видимости, вам не нужно беспокоиться об удалении его. Итак, вот что я не понимаю: почему бы просто не объявить переменную в стеке в первую очередь?Может ли кто-нибудь объяснить мне точку RAII?

+3

RAII для тех пола-редких случаев, когда вы не можете поместить переменные в стеке. Однако RAII не ограничивается указателями. Это может быть так же просто, как обертывание библиотеки C или закрытие потока файлов, когда он существует. – Rapptz

+0

Указатель, объявленный в стеке, автоматически не удаляется. – MicroVirus

+3

это не управление памятью, а управление _resource_. другие ресурсы - это дескриптор файла, блокировка и т. д. –

ответ

1

Есть несколько вещей неправильно с пониманием:

  1. Точка RAII является устранение трудностей управления ресурсами, а не только память. Например: дескриптор файла, который должен быть закрыт, мьютекс, который нужно разблокировать, объект, который должен быть выпущен, память, которая должна быть освобождена. В принципе, если есть что-то, что вам нужно, когда вы закончите использовать ресурс, это хороший пример для RAII.

  2. Когда исходный указатель на C++ выходит за пределы области видимости, он ничего не делает. Я предполагаю, что вы говорите о умном указателе, который является ничем иным, как объектом, который обертывает необработанный указатель. Когда этот объект выходит из области видимости, его деструктор вызывается, и деструктор может использоваться, в свою очередь, для освобождения памяти, которая была выделена в конструкторе.

  3. Не имеет значения, был ли выделен предмет, который должен быть «выпущен», в стек или кучу. Дело в том, что вы делаете что-то в конструкторе, когда приобретаете ресурс, и когда вы закончите с ним, вы делаете что-то еще в деструкторе.

+0

«Когда этот объект выходит из области видимости, его деструктор вызывается и деструктор может использоваться, в свою очередь, для освобождения памяти, которая была выделена в конструкторе». Ах, я понял. Благодарю. – user3213507

2

Вы не можете объявить подключение к базе данных или окно или файл в стеке. По крайней мере, можно утверждать, что это именно то, что разрешает вам RAII, но без этого вы не можете.

1

Пункт RAII заключается в том, что деструктор будет вызван независимо от того, как вы выходите из области действия.

Итак, независимо от того, выходите ли вы нормально или выбросив исключение, ваш ресурс будет освобожден.

BTW, «ресурс» не должен быть просто память - это может быть дескриптор файла, соединение с базой данных и т.д.