开发环境:delphi2007
测试代码:procedure TForm1.FormCreate(Sender: TObject);
var
  i:integer;
  myClass: TMyClass;
begin
  for i :=0 to 9 do
  begin
    myClass := TMyClass.Create;
    myClass.id := 1;
    myClass.context := 'cccdddeee';
    ComboBox1.Items.AddObject(myClass.context,myClass);
  end;
end;
前提:myClass就定义成局部变量,类成员变量或全局变量不用讨论myClass实际上是引用,这个时候不能释放。而定义的又是局部变量,Form1.Close的时候肯定是找不着了。问题:最后还用释放他们吗?如何释放?是否通过循环:(ComboBox1.Items[i] as myClass).Free;

解决方案 »

  1.   

    需要人为释放不过,如果包含这些items的对象如果能提供一个OnDeleteItem的事件就好了,可以在事件里释放,而事件是会在适当时机被触发
      

  2.   

    不一定,只要有释放的地方就可以了。
    但楼主的情况需要释放:  for i :=ComboBox1.Items.count - 1 downto 0 do
      begin
        TMyClass(ComboBox1.Items.Objects[i]).Free;
        //或者FreeAndNil(TMyClass(ComboBox1.Items.Objects[i]));
      end;
      

  3.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        ComboBoxStr: TComboBox;
        Button3: TButton;
        Button4: TButton;
        Button5: TButton;
        ComboBoxInt: TComboBox;
        Button6: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
        procedure Button6Click(Sender: TObject);
        procedure Button5Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}const
      MemSize=1024;
      
    procedure TForm1.Button1Click(Sender: TObject);
      procedure AddItem(str:string);
      var
        p:Pointer;  //无类型指针
      begin
        GetMem(P,MemSize); 
        string(p^):='ptr: '+str;
        ComboBoxStr.Items.AddObject(str,p);
        // 第二个参数实际上就是一个指针 
         // 指针没指向任何地方或没显式分配内存时时就是nil 
        // string(Pointer(Items.Objects[itemIndex])^) 这样取指针里的内容就会报错误
      end;
    begin
      AddItem('aaa');
      AddItem('bbb');
      AddItem('ccc');
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      I:Integer;
    begin
      with ComboBoxStr do
        for I := Items.Count -1 downto 0 do
        begin
          FreeMem(Pointer(Items.Objects[I]),MemSize);
          items.Delete(I);
          //delete只是删除指针本身,所以指针指向的地方的内存要你自己负责Free
        end;
    end;procedure TForm1.Button3Click(Sender: TObject);
    begin
      with ComboBoxStr do
        if ItemIndex > -1 then
          ShowMessage(string(Pointer(Items.Objects[itemIndex])^));
    end;procedure TForm1.Button4Click(Sender: TObject);
      procedure AddItem(str:string);
      begin
        ComboBoxInt.Items.AddObject(str,TObject(StrToInt(str)));
        //这里为什么没申请内存??因为指针本身就是用一个integer来表示的
      end;
    begin
      AddItem('111');
      AddItem('222');
      AddItem('333');
    end;
    procedure TForm1.Button5Click(Sender: TObject);
    var
      I:Integer;
    begin
      with ComboBoxInt do
        for I := Items.Count -1 downto 0 do
          items.Delete(I);
    end;procedure TForm1.Button6Click(Sender: TObject);
    begin
      with ComboBoxInt do
        if ItemIndex > -1 then
          ShowMessageFmt('%d',[Integer(Items.Objects[itemIndex])]);
    end;end.---------------------------------------------------------------------
    object Form1: TForm1
      Left = 0
      Top = 0
      Caption = 'Form1'
      ClientHeight = 161
      ClientWidth = 505
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      Position = poDesktopCenter
      PixelsPerInch = 96
      TextHeight = 13
      object Button1: TButton
        Left = 232
        Top = 40
        Width = 75
        Height = 25
        Caption = #24314#31435
        TabOrder = 0
        OnClick = Button1Click
      end
      object Button2: TButton
        Left = 394
        Top = 40
        Width = 75
        Height = 25
        Caption = #28165#38500
        TabOrder = 1
        OnClick = Button2Click
      end
      object ComboBoxStr: TComboBox
        Left = 48
        Top = 42
        Width = 145
        Height = 21
        ItemHeight = 13
        TabOrder = 2
        Text = #27979#35797#23383#31526#20018
      end
      object Button3: TButton
        Left = 313
        Top = 40
        Width = 75
        Height = 25
        Caption = #26597#30475
        TabOrder = 3
        OnClick = Button3Click
      end
      object Button4: TButton
        Left = 232
        Top = 88
        Width = 75
        Height = 25
        Caption = #24314#31435
        TabOrder = 4
        OnClick = Button4Click
      end
      object Button5: TButton
        Left = 394
        Top = 88
        Width = 75
        Height = 25
        Caption = #28165#38500
        TabOrder = 5
        OnClick = Button5Click
      end
      object ComboBoxInt: TComboBox
        Left = 48
        Top = 90
        Width = 145
        Height = 21
        ItemHeight = 13
        TabOrder = 6
        Text = #27979#35797#25968#23383
      end
      object Button6: TButton
        Left = 313
        Top = 88
        Width = 75
        Height = 25
        Caption = #26597#30475
        TabOrder = 7
        OnClick = Button6Click
      end
    end
      

  4.   

    //上面代码有错,不应该用string,要指定长度string[100]这样type
      TMyStr=string[50];
    procedure TForm1.Button1Click(Sender: TObject);
      procedure AddItem(str:TMyStr);
      var
        p:Pointer;  //无类型指针
      begin
        GetMem(P,Length(str));
        TMyStr(p^):=str;
        ComboBoxStr.Items.AddObject(str,p);
        // 第二个参数实际上就是一个指针
        // 指针没指向任何地方或没显式分配内存时时就是nil
        // Pointer(Items.Objects[itemIndex])^ 这样取指针里的内容就会报错误
      end;
    begin
      AddItem('aaa');
      AddItem('bbb');
      AddItem('ccc');
    end;
      

  5.   

    procedure TForm1.Button1Click(Sender: TObject);
      procedure AddItem(str:TMyStr);
      var
        p:Pointer;  //无类型指针
      begin
        GetMem(P,SizeOf(str)); //固定长度  
        //Length(str)),实际长度;  
        TMyStr(p^):=str;
        ComboBoxStr.Items.AddObject(str,p);
        // 第二个参数实际上就是一个指针
        // 指针没指向任何地方或没显式分配内存时时就是nil
        // Pointer(Items.Objects[itemIndex])^ 这样取指针里的内容就会报错误
      end;
    begin
      AddItem('aaa');
      AddItem('bbb');
      AddItem('ccc');
    end;