TDictionary 与 TObjectDictionary

TDictionary 与 TObjectDictionary 的区别是 : TObjectDictionary 可以做到 free的时候 里面的对象 一并free,从而不会出现内存 泄露。

用途:

TDictionary 适合 内存自管理的东西 如:integer int64 word string 结构体  与 动态数组(基本类型与结构体)。如下用法:

TObjectDictionary<string, RPerson>.create();

TObjectDictionary 适合 对象 等内存 手动管理的东西,一般就是 对象。如下用法:

可以发现它有三个构造函数;ACapacity 的意思是 构造的时候 首先创建几个对象。就是说 静态的创建映射类。可以做到映射类创建的时候 事先就内置几个 对象。

Ownerships 的意思是 key或value 跟随 字典一并释放,是个集合参数,那么可以集合为空 或 key 或 key+value 或 value 4种情况。

空集合的时候 表示 key 和 value 都不跟随字典一并释放,需要手工释放。

doOwnsKeys ---- 表示key 跟随字典一并释放。

doOwnsValues --- 表示value 跟随字典一并释放。

demo如下,可以参见:

unit Unit5;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Generics.Collections;

type
  TForm5 = class(TForm)
    Memo1: TMemo;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TPerson = class
    public
      name: string;
      age: Integer;
  end;

var
  Form5: TForm5;

implementation

{$R *.dfm}

procedure TForm5.Button2Click(Sender: TObject);
var
  map: TObjectDictionary<string, TPerson>;
  map2: TObjectDictionary<TObject, TPerson>;
  keyStr: string;
  tempButton: TObject;
begin
  //这么写会报错,因为key是string类型的内存释放自管理的, 不能交由字典来管理, 值是object类型的可以
  //map := TObjectDictionary<string, TPerson>.Create([doOwnsKeys,doOwnsValues]);
  map := TObjectDictionary<string, TPerson>.Create([doOwnsValues]);

  //注意这里就得写 doOwnsKeys,doOwnsValues] 了,因为key 与 value 都是 对象, 要想map2释放的时候 key与value连同释放就得如此
  map2 := TObjectDictionary<TObject, TPerson>.Create([doOwnsKeys, doOwnsValues]);
  try
    map.Add(‘11‘, TPerson.Create);
    map.Add(‘22‘, TPerson.Create);
    map[‘11‘].name := ‘小李飞刀‘;
    map[‘22‘].name := ‘火云邪神‘;

    for keyStr in map.Keys do
    begin
      Memo1.Lines.Add(keyStr + ‘------‘ + map[keyStr].name );
    end;

    map2.Add(TButton.Create(nil), TPerson.Create);
    map2.Add(TButton.Create(nil), TPerson.Create);
    for tempButton in map2.Keys do
    begin
      TButton(tempButton).Top := Random(200);
      TButton(tempButton).Left := Random(200);
      TButton(tempButton).Caption := ‘测试‘;
      TButton(tempButton).Parent := Self;

    end;
    Application.ProcessMessages;
    Sleep(4000) ; // 注意观察 button 会 4秒后 消失。
  finally
    map.Free;
    map2.Free;
  end;
end;

procedure TForm5.FormCreate(Sender: TObject);
begin
  ReportMemoryLeaksOnShutdown := True;
end;

end.
时间: 2024-10-18 09:58:59

TDictionary 与 TObjectDictionary的相关文章

TStringList 与 泛型字典TDictionary 的 哈希功能效率PK

结论:做HashMap 映射 功能的时候 ,字典TDictionary 功能更强大,且效率更高,比如不仅仅可以存String,还可以存结构和类. unit Unit5; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, S

使用 Delphi Xe 的 TDictionary

原本一直使用 TList, 将定义的一个个 Record 保存在TList 里面, 为了能把某些对象管理起来, 例如一个类的 n 多实例,可以进行索引.查找.释放等 今天刚看到原来已经有了一个叫 TDictionary 对象,用起来挺方便. 挺像我们在DB中定义的 Dictionary 表,Key.Value.  而那个不管Key.Value 都挺发达,允许各种定义的类. ok,下面官方Demo很通俗易懂,各方法都在: type TCity = class Country: String; La

TDictionary 是delphi用的,c++builder用起来太吃力。

TDictionary 是delphi用的,c++builder用起来太吃力.c++还是用std::map代替. #include <map> void __fastcall TForm2::FormCreate(TObject *Sender) { std::map<String, String> *Dir = new std::map<String, String>; delete Dir; } Or: #include <map> void __fas

Delphi 2009 泛型容器单元(Generics.Collections)[1]: TList&lt;T&gt;

Delphi 2009 新增了泛型容器单元: Generics.Collections, 同时还有一个 Generics.Defaults 单元做支持. Generics.Collections 包含了以下实用类:TList<T>TQueue<T>TStack<T>TDictionary<TKey,TValue>TObjectList<T>TObjectQueue<T>TObjectStack<T>TObjectDicti

kbmmw 5.0 beta1 发布

经过大半年的等待,kbmmw 的新版终于来了.经过近5年的打磨, kbmmw 的版本号升级到5了. kbmMW is a portable, highly scalable, high end application server and enterprise architecture integration (EAI) development framework for Win32, ..Net and Linux with clients residing on Win32, .Net, L

TMsgThread, TCommThread -- 在delphi线程中实现消息循环(105篇博客,好多研究消息的文章)

在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使用很方便,但是有时候我们需要在线程类中使用消息循环,delphi没有提供. 花了两天的事件研究了一下win32的消息系统,写了一个线程内消息循环的测试. 但是没有具体应用过,贴出来给有这方面需求的DFW参考一下.希望大家和我讨论. {----------------------------------------------------------------------------- Unit

delphi 各新版本特性收集

delphi 各新版本特性收集 Delphi XE6新增了一些特性并增强了原有的功能,主要有以下几个方面: IDE(整合开发环境) Internet XML(扩展标记语言) Compiler(编译器) COM/Active X Database support(数据库支持) CORBA Actions(动作) Custom Variants(可定义的可变类型) VCL 单元和特性 RTL单元和特性 Cross-platform development(跨平台开发) Translation too

KBMMW 4.70.00 发布

We are happy to announce the release of kbmMW v. 4.70.00 Professional and Enterprise Edition. kbmMW continues to set the bar for what an n-tier product must be capable of in the real world! New stuff ========= - Added support for marshalling and dema

FireMonkey 源码学习(4)

(4)DoDrawLayout DoDrawLayout函数的源代码分析如下: procedure TTextLayoutNG.DoDrawLayout(const ACanvas: TCanvas); var CharDic: TCharDic; Rec: PCharRec; Pos: TPointF; R, SrcR, ClipBounds: TRectF; LLine: TGPULine; LRun: TGPURun; I, J, K: Integer; VerticalAligned,