У меня есть класс 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_};
Мой вопрос:
Как это называется мой деструктор?
Когда генерируется исключение и управление переходит из блока 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: }
Компилятор автоматически генерирует код для вызова деструкторов локальных переменных.*
* Технически они известны как «объекты с автоматическим хранением». Должно быть понятно почему!