另一个Delphi无效的指针操作

时间:2017-05-05 22:44:18

标签: delphi delphi-10.2-tokyo

此VCL表单程序生成无效指针操作通知:

Uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls,
  DcadMenu_u;

type
  TForm1 = class(TForm)
    MenuTestRichEdit: TRichEdit;
    LoadButton: TButton;
    procedure ButtonLoadClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ButtonLoadClick(Sender: TObject);
  var
    menu : TDcadMenu;
    item1, item2 : TDcadMenuItem;
    strlist :tstringlist;
    i : integer;
  begin
    menu := tDcadMenu.Create();
    item1 := TDcadMenuItem.create ('Option1', 'Do Option1', false, false, true);
    menu.add (item1);
    item2 := TDcadMenuItem.create ('Option2', 'Do Option2', false, false, true);
    menu.add (item2);
    strlist := tstringlist.Create;
    Try
      For i :=  0 to Menu.Count - 1 DO
        begin
          item1 := menu.Items[i];
          strlist.Add (Item1.lblset + '  |  ' + Item1.lblmsg );
         end;
      Form1.MenuTestRichEdit.Lines := strlist;
    finally
      item1.free;
      item2.Free;
      menu.free;
      strlist.Free;
    end;
  end;

代码工作正常,并在Richedit组件中生成项目列表。我怀疑我正在释放一个已被处理的对象,但不明确具体原因是什么。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:2)

我们无法看到TDcadMenu的实现,但通常在项目中添加项目会将项目的所有权提供给该类,因此无需释放课程外的项目。正如@Remy所述,在释放menu对象之前,通常可以安全地释放它们。

在您的代码中,您将重新分配item1,并在释放项目时,Item1Item2两者共享与menu.Items[1]相同的实例。这意味着你有一个双重自由,它会给你无效的指针通知。

item1.free;
item2.Free;  // <- Double free of same instance