在类中创建弹出菜单     PopUpMenu1 := TPopupMenu.Create(self);
     PopUpMenu := PopUpMenu1;     setlength(PopItems, TotalCurves - 1);
     for i := 0 to X - 1 do
     begin
          PopItems[i] := TMenuItem.Create(self);
          PopItems[i].Caption := C[i].DataName;
          PopUpMenu1.Items.Add(PopItems[i]);
     end;
     PopUpMenu1.Items[0].OnClick := myclick;在类的释放中
     for i := totalcurves - 1 downto 0 do
     begin
          c[i].Free;
          PopUpMenu1.Items[i].Free;   //行1
     end;
     PopUpMenu1.Free;    //行2
     inherited Destroy;没有和有 行1及行2,释放类实例时有无效指针, 只有行2也不行关闭了全部菜单代码一切ok

解决方案 »

  1.   

    c[i]是什么?
    另外,没必要手工销毁TPopupMenu的子项,直接PopupMenu*.Free它会删除所有子菜单的,不会造成memleak。
      

  2.   

    正常有Create就要有free,看样子是C[i].free的问题,
    改为如下试试:  在类中创建弹出菜单  PopUpMenu1 := TPopupMenu.Create(self);
      PopUpMenu := PopUpMenu1;  setlength(PopItems, TotalCurves - 1);
      for i := 0 to X - 1 do
      begin
        PopItems[i] := TMenuItem.Create(self);
        PopItems[i].Caption := C[i].DataName;
        PopUpMenu1.Items.Add(PopItems[i]);
      end;
      PopUpMenu1.Items[0].OnClick := myclick;  在类的释放中  for i := totalcurves - 1 downto 0 do
      begin
        //c[i].Free;
        if Assign(PopUpMenu1.Items[i]) then
          PopUpMenu1.Items[i].Free; //行1
      end;
      if Assign(PopUpMenu1);
      PopUpMenu1.Free; //行2
      inherited Destroy;
      

  3.   

    if Assign(PopUpMenu1); 
    ->
    if Assign(PopUpMenu1) then
      

  4.   

    不好意思,
    是Assigned,不是Assign