You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++Builder中为DataModule添加析构函数时如何避免访问冲突?

解决C++Builder中DataModule添加析构函数导致的Access Violation问题

问题根源

你的代码存在两个核心问题:

  • 自定义析构函数未遵循VCL/FMX组件的__fastcall调用约定,导致析构流程中函数匹配错误
  • 析构函数未调用父类TDataModule的析构函数,破坏了对象销毁的完整流程
  • 额外提醒:你创建TDataModule2时指定Form1作为Owner,窗体销毁时会自动释放该DataModule,无需手动delete,否则会触发重复释放

修正后的代码

DataMod2.h

#ifndef DataMod2H
#define DataMod2H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
//---------------------------------------------------------------------------
class TDataModule2 : public TDataModule
{
__published:    // IDE-managed Components
private:    // User declarations
public:     // User declarations
    __fastcall TDataModule2(TComponent* Owner);
    // 保持与父类一致的__fastcall调用约定
    __fastcall ~TDataModule2();
};
//---------------------------------------------------------------------------
extern PACKAGE TDataModule2 *DataModule2;
//---------------------------------------------------------------------------
#endif

DataMod2.cpp

#pragma hdrstop

#include "DataMod2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma classgroup "FMX.Controls.TControl"
#pragma resource "*.dfm"
TDataModule2 *DataModule2;
//---------------------------------------------------------------------------
__fastcall TDataModule2::TDataModule2(TComponent* Owner)
    : TDataModule(Owner)
{
}
//---------------------------------------------------------------------------
__fastcall TDataModule2::~TDataModule2() {
    // 必须调用父类析构函数,完成基类资源清理
    TDataModule::~TDataModule();
}
//---------------------------------------------------------------------------

关键注意事项

  • 由于你以Form1作为Owner创建DataModule,窗体销毁时会自动触发DataModule的释放,不要在窗体析构函数中手动执行delete dataMod,否则会导致重复释放内存,同样引发Access Violation。
  • 若需手动管理DataModule生命周期,创建时传入nullptr作为Owner,之后在合适时机(如窗体销毁前)手动调用delete dataMod。

内容的提问来源于stack exchange,提问作者Vic Fanberg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 17:56:23