delphi 2010接手的公司真的太不负责了,终于找到内存不断泄露的原因了,没天理啊。希望有高手可以完善下。

bbc9527 2013-08-04 07:42:45

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究竟应该怎么 修改 才能保证内存不再泄露。谢谢大家了。
我的积分也快没了,不过我还是全部都拿出来了,希望大可以帮下,非常非常感谢。
...全文
435 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
tcmakebest 2013-08-11
  • 打赏
  • 举报
回复
光 clear 肯定不行的,要先逐一 free,最后再 clear
火龙岛主 2013-08-05
  • 打赏
  • 举报
回复
方法有两种 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;
pathletboy 2013-08-05
  • 打赏
  • 举报
回复
如果几个列表同时加同个对象,其中一个列表释放把对象都给释放了,那另外个列表里的对象访问就非法,这么设计更不合理。
林石公 2013-08-05
  • 打赏
  • 举报
回复
嘿嘿嘿,一直就这样,文档上也说的清清楚楚
haitao 2013-08-05
  • 打赏
  • 举报
回复
一直没使用d7后的版本,所以没用过d的泛型 只说普通Tlist,它的clear应该是只清除列表项,至于列表项所指的内容,自然是不敢随便清除的 它怎么知道列表项所指的内容,是不是还有别的代码会使用 如果开发者知道没人使用了,应该清除,在clear之前,自行循环清除好了
dollavon 2013-08-05
  • 打赏
  • 举报
回复
决对没有笑话的意思。只是觉得贸然去说开发工具有问题,不认同罢了。
bbc9527 2013-08-05
  • 打赏
  • 举报
回复
楼主这水平,还是用TObjectList<T>吧。呵呵~~ ------------水平是菜鸟级的,不担心别人耻笑,不懂得就问么。谁都从不懂得开始。 这个TObjectList<T> 怎么使用?希望发个例子。谢谢了 =============================================================== 感谢两位回复,自知自己是菜鸟级的,发出来也别人笑话也没关系。关键是想怎样解决这个问题。 非常感谢两位给的一些提示,谢谢
bbc9527 2013-08-05
  • 打赏
  • 举报
回复
真是奇葩!不是Delphi需要修改它的clear方式,而你是本人,需要转变一下思路。 -------------可不可以告诉我 怎么转变 非常感谢
  • 打赏
  • 举报
回复
吓俺一跳, 这个应该不是bug吧, 如果你保存的是指针,你需要自己释放 如果你需要自动释放对象 ,请使用 TObjectList。
bbc9527 2013-08-05
  • 打赏
  • 举报
回复
谢谢回复 ,找到原因了,内存泄露不是我代码的问题,另有原因。
dollavon 2013-08-04
  • 打赏
  • 举报
回复
楼主这水平,还是用TObjectList<T>吧。呵呵~~
董董 2013-08-04
  • 打赏
  • 举报
回复
真是奇葩!不是Delphi需要修改它的clear方式,而你是本人,需要转变一下思路。

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧