2013-06-04 95 views
6

我想修复已使用多年的记录TMyValue中的设计缺陷,并且我非常想将其修复到记录本身中 - 以避免更改公共接口 - 而且不需要代码使用记录进行更改。保证堆栈记录的初始化

本质上,缺陷是TMyValue在创建时必须初始化为零,否则在其上调用Clear方法会导致崩溃。这是因为它包含一个字段,如果指针非零,则它是指向动态分配内存的指针,Clear将释放动态内存。

如果TMyValue在堆栈上创建,这是一个问题,因为堆栈变量在创建时不会自动清零。

我想我可以使用记录构造函数来清零记录,但记录构造函数不能无参数。推测这意味着当在堆栈上创建记录时,不能强制自动执行记录构造函数。

我怀疑我的问题的答案是“它不能做”。请证明我错了!

回答

7

在您的记录中添加一个虚拟字符串成员。 由于字符串是托管类型,因此当记录进入作用域时,它将被初始化为空字符串。

因此,在调用Clear方法时,首先测试虚拟字符串是否为空。 将字符串设置为适合使用逻辑的值以将记录标记为已初始化。

+0

不错。我总是喜欢让编译器让你的生活更轻松。 –

+1

@MarjanVenema,知道一些技巧总是很好。但是,能够在记录上声明初始化/完成例程应该在很久以前就已经实施了。参见['QC21729记录操作符重载:请执行“Initialize”和“Finalize”操作符](http://qc.embarcadero.com/wc/qcmain.aspx?d=21729)。我想补充说的是,所有内部程序也应该能够用于类操作符的记录。我的意思是复制,高,低,长度,SetLength等 –

+0

哦,是啊!投票,我输入... –