RAII обработка ресурсов

У меня есть класс RAII:


 template<typename T>
class RAII
{
public:
explicit RAII( T* p = 0 ): p_(p){}

~RAII() {delete p_;}

T& operator*() const { return p_;}
T* operator‐>() const{ return p_;}
};

{

RAII<std::vector<int>> r(new std::vector<int>());
std::cout<<r­‐>size()<<std::endl;

} // The std::vector<int> is automatically deallocated

Я знаю, что когда я выйду за рамки, мой деструктор будет вызван. ~RAII() {delete P_};

Мой вопрос:

Как это называется мой деструктор?

7

Решение

Когда генерируется исключение и управление переходит из блока try в обработчик, среда выполнения C ++ вызывает деструкторы для всех автоматических объектов, созданных с начала блока try. Этот процесс называется разматыванием стека. Автоматические объекты уничтожаются в порядке, обратном их построению. (Автоматические объекты — это локальные объекты, которые были объявлены как auto или register, или не объявлены как static или extern. Автоматический объект x удаляется всякий раз, когда программа выходит из блока, в котором объявлен x.)

Если во время конструирования объекта, состоящего из подобъектов или элементов массива, выдается исключение, деструкторы вызываются только для тех подобъектов или элементов массива, которые были успешно созданы до того, как было сгенерировано исключение. Деструктор для локального статического объекта будет вызываться только в том случае, если объект был успешно создан.

Если при размотке стека деструктор генерирует исключение, и это исключение не обрабатывается, вызывается функция terminate ().

Пример: см. Разборка ниже. Вы увидите, что деструктор уже помещен в стек.

class Test
{
public:
Test()

{
std::cout<<"C'tor\n";
}
~Test()
{
std::cout<<"D'tor\n";
}
}
int main()//_TCHAR* argv[])
{
Test();
}
00DD9C30 55                   push        ebp
00DD9C31 8B EC                mov         ebp,esp
00DD9C33 81 EC CC 00 00 00    sub         esp,0CCh
00DD9C39 53                   push        ebx
00DD9C3A 56                   push        esi
00DD9C3B 57                   push        edi
00DD9C3C 8D BD 34 FF FF FF    lea         edi,[ebp-0CCh]
00DD9C42 B9 33 00 00 00       mov         ecx,33h
00DD9C47 B8 CC CC CC CC       mov         eax,0CCCCCCCCh
00DD9C4C F3 AB                rep stos    dword ptr es:[edi]
23:
24:     Test();
00DD9C4E 8D 8D 3B FF FF FF    lea         ecx,[ebp-0C5h]
00DD9C54 E8 67 7C FF FF       call        Test::Test (0DD18C0h)
00DD9C59 8D 8D 3B FF FF FF    lea         ecx,[ebp-0C5h]
00DD9C5F E8 03 76 FF FF       call        Test::~Test (0DD1267h)
25: }
6

Другие решения

Компилятор автоматически генерирует код для вызова деструкторов локальных переменных.*


* Технически они известны как «объекты с автоматическим хранением». Должно быть понятно почему!

4

По вопросам рекламы [email protected]