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

Lazarus项目点击Button4触发EXC_BAD_ACCESS错误求助

EXC_BAD_ACCESS (code=1, address=0xf0) 错误排查与修复方案

错误原因分析

这个错误属于空指针访问,address=0xf0表明代码尝试访问某个对象实例偏移0xf0的位置,但该对象实例本身是nil(未初始化)或已被释放。结合你的场景,大概率是以下情况:

  • 数据存储单元(uSpeicher)、计数单元(uZaehler)中的核心对象未初始化就被调用
  • EingabeSchuler过程中,向未创建的对象实例赋值
  • Button4事件逻辑中直接访问了已释放的对象

具体修复步骤

1. 确保核心对象在程序启动时初始化

在界面单元(Oberflache)的Form创建事件中,初始化uSpeicher和uZaehler中的类实例,避免空指针:

procedure TOberflache.FormCreate(Sender: TObject);
begin
  // 假设uSpeicher中定义了全局/类成员变量 Speicher: TSpeicher;
  Speicher := TSpeicher.Create;
  // 假设uZaehler中定义了全局/类成员变量 Zaehler: TZaehler;
  Zaehler := TZaehler.Create;
end;

同时在Form销毁时释放对象,防止内存泄漏:

procedure TOberflache.FormDestroy(Sender: TObject);
begin
  Speicher.Free;
  Zaehler.Free;
end;

2. 给Button4事件添加空指针检查

在触发核心逻辑前,先校验对象是否有效:

procedure TOberflache.Button4Click(Sender: TObject);
begin
  if (Speicher = nil) or (Zaehler = nil) then
  begin
    ShowMessage('数据模块未初始化');
    Exit;
  end;
  
  EingabeSchuler;
end;

3. 修正EingabeSchuler中的赋值逻辑

如果是向学生对象赋值,必须先创建对象实例,再进行属性赋值:

procedure TOberflache.EingabeSchuler;
var
  NewSchueler: TSchueler;
begin
  // 先创建学生对象实例
  NewSchueler := TSchueler.Create;
  try
    // 从界面控件读取值并赋值
    NewSchueler.Name := Edit_Name.Text;
    NewSchueler.Alter := StrToIntDef(Edit_Alter.Text, 0); // 用StrToIntDef避免转换错误
    
    // 存入数据存储
    Speicher.AddSchueler(NewSchueler);
    // 更新计数
    Zaehler.Increment;
  except
    // 出错时释放未存入的对象
    NewSchueler.Free;
    raise;
  end;
end;

4. 检查uSpeicher和uZaehler的内部实现

确保类内部的存储结构已初始化,比如uSpeicher中的TSpeicher类:

type
  TSpeicher = class
  private
    FSchuelerList: TList<TSchueler>;
  public
    constructor Create;
    procedure AddSchueler(Schueler: TSchueler);
    destructor Destroy; override;
  end;

constructor TSpeicher.Create;
begin
  inherited;
  // 初始化内部存储列表
  FSchuelerList := TList<TSchueler>.Create;
end;

procedure TSpeicher.AddSchueler(Schueler: TSchueler);
begin
  if Schueler <> nil then
    FSchuelerList.Add(Schueler);
end;

destructor TSpeicher.Destroy;
begin
  // 释放存储的学生对象(如果需要)
  while FSchuelerList.Count > 0 do
    FSchuelerList[0].Free;
  FSchuelerList.Free;
  inherited;
end;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 13:35:21