TObject::BeforeDestruction - C++ Builder

C++ Builder 参考手册SystemTObjectBeforeDestruction


头文件:#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 参考手册SystemTObjectBeforeDestruction

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容