在C++中,赋值运算符中有一个常见的习惯用法,你必须避免将对象复制到自身所引起的问题.
http://www.parashift.com/c++-faq/self-assignment-why.html
但是,在Delphi VCL中(至少在D2010中),这似乎并没有得到很好的处理.
作为一个例子,下面的函数将清除的TStringList
传递给它!
procedure foo(var strings:TStringList)
begin
strings.Assign(strings);
end;
Run Code Online (Sandbox Code Playgroud)
对于更高版本的Delphi,这仍然是一个问题 - 还是有一种常见的方法来处理这个问题?
自我分配在Delphi中很少见,这就是为什么它不常检查的原因.由于类实例必须在堆上分配,并且赋值运算符在类中不可覆盖,因此必须明确地从一个对象到另一个对象的赋值,例如via TPersistent.Assign()
.大多数Delphi用户都了解这一点,并且不会编写将对象自身或意外地分配给自身的代码.
自我赋值在C++中更常见,特别是因为它在某些情况下实际上可以由编译器本身生成.赋值运算符是可重载的.因此,在C++中进行自我分配检查更有意义.
归档时间: |
|
查看次数: |
355 次 |
最近记录: |