C++ Builder 参考手册 ➙ System ➙ TObject ➙ BeforeDestruction
头文件:#include <systobj.h>
命名空间:System
函数原型:
virtual void __fastcall BeforeDestruction(void);
System::TObject::BeforeDestruction 是 System::TObject 的成员函数。
- TObject 执行析构函数之前会自动调用 BeforeDestruction,不要直接调用这个函数。
- 在调用 BeforeDestruction 的时候,还没做任何销毁动作呢。
- 只有当构造函数完整执行完成的情况下,析构之前才会调用 BeforeDestruction,如果在构造函数里面抛出了异常,会调用析构函数,但是不会调用 BeforeDestruction。
- 重载这个函数可以处理析构函数调用之前需要运行的代码,例如 TCustomForm 利用重载的 BeforeDestruction 来产生 OnDestroy 事件。
例1:没有异常的情况,构造函数、析构函数、AfterConstruction、BeforeDestruction 的执行顺序
class TTestObjBase : public TObject
{
public:
__fastcall TTestObjBase();
__fastcall ~TTestObjBase();
void __fastcall AfterConstruction(void);
void __fastcall BeforeDestruction(void);
};
__fastcall TTestObjBase::TTestObjBase()
{
Form1->Memo1->Lines->Add(L"父类:构造函数");
}
__fastcall TTestObjBase::~TTestObjBase()
{
Form1->Memo1->Lines->Add(L"父类:析构函数");
}
void __fastcall TTestObjBase::AfterConstruction(void)
{
TObject::AfterConstruction();
Form1->Memo1->Lines->Add(L"父类:AfterConstruction");
}
void __fastcall TTestObjBase::BeforeDestruction(void)
{
TObject::BeforeDestruction();
Form1->Memo1->Lines->Add(L"父类:BeforeDestruction");
}
//---------------------------------------------------------------------------
class TTestObj : public TTestObjBase
{
public:
__fastcall TTestObj();
__fastcall ~TTestObj();
void __fastcall AfterConstruction(void);
void __fastcall BeforeDestruction(void);
};
__fastcall TTestObj::TTestObj()
{
Form1->Memo1->Lines->Add(L"子类:构造函数");
}
__fastcall TTestObj::~TTestObj()
{
Form1->Memo1->Lines->Add(L"子类:析构函数");
}
void __fastcall TTestObj::AfterConstruction(void)
{
TTestObjBase::AfterConstruction();
Form1->Memo1->Lines->Add(L"子类:AfterConstruction");
}
void __fastcall TTestObj::BeforeDestruction(void)
{
TTestObjBase::BeforeDestruction();
Form1->Memo1->Lines->Add(L"子类:BeforeDestruction");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TTestObj *obj;
try
{
try
{
obj = new TTestObj;
}
__finally
{
delete obj;
}
}
catch(Exception &e)
{
Memo1->Lines->Add(e.Message);
}
}
运行结果:

没有异常的运行结果
例2:构造函数抛出异常的情况,构造函数、析构函数、AfterConstruction、BeforeDestruction 的执行顺序
class TTestObjBase : public TObject
{
public:
__fastcall TTestObjBase();
__fastcall ~TTestObjBase();
void __fastcall AfterConstruction(void);
void __fastcall BeforeDestruction(void);
};
__fastcall TTestObjBase::TTestObjBase()
{
Form1->Memo1->Lines->Add(L"父类:构造函数");
}
__fastcall TTestObjBase::~TTestObjBase()
{
Form1->Memo1->Lines->Add(L"父类:析构函数");
}
void __fastcall TTestObjBase::AfterConstruction(void)
{
TObject::AfterConstruction();
Form1->Memo1->Lines->Add(L"父类:AfterConstruction");
}
void __fastcall TTestObjBase::BeforeDestruction(void)
{
TObject::BeforeDestruction();
Form1->Memo1->Lines->Add(L"父类:BeforeDestruction");
}
//---------------------------------------------------------------------------
class TTestObj : public TTestObjBase
{
public:
__fastcall TTestObj();
__fastcall ~TTestObj();
void __fastcall AfterConstruction(void);
void __fastcall BeforeDestruction(void);
};
__fastcall TTestObj::TTestObj()
{
Form1->Memo1->Lines->Add(L"子类:构造函数");
throw Exception(L"这是子类构造函数抛出来的异常");
}
__fastcall TTestObj::~TTestObj()
{
Form1->Memo1->Lines->Add(L"子类:析构函数");
}
void __fastcall TTestObj::AfterConstruction(void)
{
TTestObjBase::AfterConstruction();
Form1->Memo1->Lines->Add(L"子类:AfterConstruction");
}
void __fastcall TTestObj::BeforeDestruction(void)
{
TTestObjBase::BeforeDestruction();
Form1->Memo1->Lines->Add(L"子类:BeforeDestruction");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TTestObj *obj;
try
{
try
{
obj = new TTestObj;
}
__finally
{
delete obj;
}
}
catch(Exception &e)
{
Memo1->Lines->Add(e.Message);
}
}
运行结果:

子类构造函数抛出异常的运行结果
通过上面截图的运行结果得出结论:
子类的构造函数抛出了异常,不会执行父类和子类的 AfterConstruction 和 BeforeDestruction,只执行了父类的析构函数,没有执行子类的析构函数。
参考:
C++ Builder 参考手册 ➙ System ➙ TObject ➙ BeforeDestruction
