procedure TList<T>.Clear;
begin
  Count := 0;
  Capacity := 0;
end;
destructor TQueue<T>.Destroy;
begin
  Clear;
  inherited;
end;procedure TQueue<T>.Clear;
begin
  while Count > 0 do
    Dequeue;
  FHead := 0;
  FTail := 0;
  FCount := 0;
end;destructor TStack<T>.Destroy;
begin
  Clear;
  inherited;
end;procedure TStack<T>.Clear; 
begin
  while Count > 0 do
    Pop;
  SetLength(FItems, 0);
end;
procedure TDictionary<TKey,TValue>.Clear;
var
  i: Integer;
  oldItems: TItemArray;
begin
  oldItems := FItems;
  FCount := 0;
  SetLength(FItems, 0);
  SetCapacity(0);
  FGrowThreshold := 0;
  
  for i := 0 to Length(oldItems) - 1 do
  begin
    if oldItems[i].HashCode = 0 then
      Continue;
    KeyNotify(oldItems[i].Key, cnRemoved);
    ValueNotify(oldItems[i].Value, cnRemoved);
  end;
end;Generics.Collections 单元里面找到 的delphi 2010 xe2一直都是这样的 。clear的时候根本不释放内存,导致内存不断的增加
clear越多 内存泄露越大,太没天理了 都过去这么多年了,一直都没改变
也不知道这里怎么修改。求高手帮忙看一下 ,这个clear究竟应该怎么 修改 才能保证内存不再泄露。谢谢大家了。
我的积分也快没了,不过我还是全部都拿出来了,希望大可以帮下,非常非常感谢。Delphi内存泄露2010内存

解决方案 »

  1.   

    真是奇葩!不是Delphi需要修改它的clear方式,而你是本人,需要转变一下思路。
      

  2.   

    楼主这水平,还是用TObjectList<T>吧。呵呵~~
      

  3.   

    真是奇葩!不是Delphi需要修改它的clear方式,而你是本人,需要转变一下思路。
    -------------可不可以告诉我 怎么转变 非常感谢
      

  4.   

    楼主这水平,还是用TObjectList<T>吧。呵呵~~
    ------------水平是菜鸟级的,不担心别人耻笑,不懂得就问么。谁都从不懂得开始。
    这个TObjectList<T> 怎么使用?希望发个例子。谢谢了
    ===============================================================
    感谢两位回复,自知自己是菜鸟级的,发出来也别人笑话也没关系。关键是想怎样解决这个问题。
    非常感谢两位给的一些提示,谢谢
      

  5.   

    一直没使用d7后的版本,所以没用过d的泛型
    只说普通Tlist,它的clear应该是只清除列表项,至于列表项所指的内容,自然是不敢随便清除的
    它怎么知道列表项所指的内容,是不是还有别的代码会使用
    如果开发者知道没人使用了,应该清除,在clear之前,自行循环清除好了
      

  6.   

    方法有两种
    1. 方法一: 你添加一个TList或TStringList,把你加的对象放到列表里管理,然后循环释放,TDictionary我一般这样处理。
    2. 方法二:
    var
      vList: TList<TObject>;
      i: integer;
    begin
      vList := TList<TObject>.Create;
      for i := vList.Count - 1 downto 0 do
      begin
        vList.Items.Free;
        vList.Delete(i);
      end;
      vList.Free;
    end;
      

  7.   

    吓俺一跳,这个应该不是bug吧,如果你保存的是指针,你需要自己释放如果你需要自动释放对象 ,请使用 TObjectList。
      

  8.   

    光 clear 肯定不行的,要先逐一 free,最后再 clear