gpt4 book ai didi

delphi - 为什么我应该在析构函数中使用 Free 而不是 FreeAndNil ?

转载 作者:行者123 更新时间:2023-12-03 14:39:31 26 4
gpt4 key购买 nike

我已阅读A case against FreeAndNil但仍然不明白为什么我不能在类析构函数中使用此方法?谁能解释一下。

更新:我认为来自 Eric Grange 的评论对我来说最有用。该链接显示,这并不明显如何处理它,这主要是一个品味问题。 FreeAndInvalidate 方法也很有用。

最佳答案

The problem with that is that many seem to use FreeAndNil as some magic bullet that will slay that mysterious crash dragon. If using FreeAndNil() in the destructor seems to solve a crash or other memory corruption problems, then you should be digging deeper into the real cause. When I see this, the first question I ask is, why is the instance field being accessed after that instance was destroyed? That typically points to a design problem.

它认为它隐藏了您遇到的真正问题。这必须意味着您的代码正在访问已被销毁的对象的属性/字段/方法(调用析构函数)。因此,您不应该用 FreeAndNil 隐藏真正的问题,而应该真正解决根本问题。

如果您在 SomeObject 的析构函数中使用 FreeAndNil PropertyA,下面的代码就不会崩溃。但它隐藏了SomeObject被销毁后又被使用的真正问题。最好解决这个设计问题(访问被破坏的对象)而不是隐藏它。

SomeObject.Free;  // Destructor called
if Assigned(SomeObject.PropertyA) then // SomeObject is destroyed, but still used
SomeObject.PropertyA.Method1;

编辑

在另一种情况下,有人可能会争辩说,如果不使用 FreeAndNil,代码也不会崩溃。因为即使对象被销毁,内存也可能不会被重用,并且所有结构可能都完好无损。如果使用 Free 而不是 FreeAndNil 来销毁 PropertyA,上面的代码甚至可能运行没有问题。

如果使用 FreeAndNil 来销毁 SomeObject,无论析构函数中的代码是什么,您也会看到真正的问题。

因此,尽管我同意这样的观点,即它可以隐藏真正的设计缺陷,并且我个人不会在析构函数中使用 FreeAndNil,但这并不是发现此类设计缺陷的 Elixir 。

关于delphi - 为什么我应该在析构函数中使用 Free 而不是 FreeAndNil ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3510179/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com