我还没有找到一些我的Delphi内存管理问题的答案。我可以测试不同的场景(为了找出破坏FreeAndNil方法的原因而做的),但是它花费的时间太长,而且很难!但是说真的,我也想知道你们(Delphi开发人员)是如何处理这些内存管理问题的。
我的问题(请随意提出你自己的问题,我相信答案也会对我有所帮助):
?
谢谢各位!
发布于 2010-03-24 19:41:36
COM对象是通过接口引用的,您不需要做任何空闲的操作。编译器负责必要的引用计数逻辑,以确保在正确的时间处理COM对象。
至于静态数组(或者说动态数组),您也不需要释放它们。如果它们包含对象,那么必须在适当的时候释放对象,但是数组不能释放。
此外,不要在任何不是对象引用的东西上使用FreeAndNil。与接口或其他变量一起使用它会破坏内存。最好不要使用它(用免费代替),除非您正在处理一个需要释放的对象,然后再进行重用。
发布于 2010-03-24 21:28:12
首先,在大多数情况下,FreeAndNil有点过火。当您将对象的字段释放在析构函数或全局(丑陋)变量上时,它非常方便。但大多数时候,只打免费电话就足够了。
您应该知道,对象变量实际上是指向对象数据的指针。当您调用Free时,该缓冲区将被释放(当然,在运行析构函数之后),但是对象变量仍然指向刚刚释放的内存位置。它被称为“悬空指针”。有一个悬空指针并不是一个问题,只要你知道它在这个上下文中悬挂。例如:
Procedure Myproc;
var vString : TStringList;
begin
//Here, vString is "dangling"
vString := TStringList.Create;
//Here, vString is valid
try
//Do some stuff
finally
vString.Free;
end;
//Here, vString is "dangling"... But who care, it's about to go out of scope and we won't use it again.
end;在不知道何时或如何释放变量的全局变量上调用FreeAndNil更有意义。尽管如此,一直调用FreeAndNil并没有什么错(除了在非常紧的循环中,您试图获得性能的每一个oz )。
现在,对于COM对象..。就像梅森所说的,它们是参考计算的。因此,如果您持有对该接口的唯一引用,调用MyInterface := nil;将释放它。但是,当/如果变量超出作用域时,编译器将负责添加清理代码,以确保接口引用减少。因此,如果您试图将内存需求保持在最低限度,请将接口设置为零。否则,就没那么重要了。
至于你的排列..。你可以在名单上的每一件物品上打电话.在那之后,选择将他们设为零。
发布于 2010-03-24 19:27:11
对于静态数组,如果创建了数组的内容,只需释放所创建的对象即可。您不需要做任何特殊的事情来清理myArr本身使用的空间。
https://stackoverflow.com/questions/2510669
复制相似问题