在释放对象后,是否可以安全地使用对象的过程?

时间:2016-08-16 14:34:32

标签: delphi

我写了这样一个简单的类:

TMyClass = class
  procedure MyProcedure(Sender : TObject);
end;

我正在执行“MyProcedure”,在对象被释放后我永远不会引用“Self”:

var
  MyObj : TMyClass;
  ProcOfObj : TNotifyEvent;
begin
  MyObj := TMyClass.Create;
  try
    ProcOfObj := MyObj.MyProcedure;
  finally
    MyObj.Free;
  end;

  ProcOfObj(Self);
end;

它有效,但我想知道这是否是一种安全的做法,或者是否会引起某些问题。

3 个答案:

答案 0 :(得分:10)

如果MyProcedure及其调用的任何方法实际上没有引用Self实例,那么您将不会遇到运行时错误。但是,这是一个冒险的游戏。只需要对代码进行一些未来的更改,而不会发现此问题,并输入未定义的行为区域。您可能会遇到运行时错误,或者您可能没有。并且编译器不会保存你。

你不想冒这个风险。因此,由于您的方法不引用实例,因此请不要将其作为实例方法。

type
  TMyClass = class
    class procedure MyProcedure(Sender : TObject);
  end;

而是使它成为一个类方法。这样就可以避免风险,如果将来某个时候你尝试引用该实例,编译器会保存你。

答案 1 :(得分:3)

这绝对是安全做法。 一旦过程尝试访问其自己对象的成员变量,您将收到访问冲突。 不要在代码中放置这样的陷阱。您或您的团队成员迟早会陷入其中。

答案 2 :(得分:2)

它不安全,它破坏了代码封装。

想象一下,如果最终您TMyClass.MyProcedure的实施发生变化并开始引用self?你会得到一个分段错误。

另外,你反对OOP,因为你必须知道你要调用它的方法的实现细节。

如果要强制您的方法不引用Self指针,请将该方法声明为静态成员。