【问题标题】:Guarantee initialisation of stack record保证堆栈记录的初始化
【发布时间】:2013-06-04 08:46:04
【问题描述】:

我想修复已使用多年的记录 TMyValue 中的设计缺陷,我迫切希望在记录本身中修复它 - 以避免更改公共接口 - 并且不需要使用记录的代码改变。

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

如果在堆栈上创建 TMyValue 则会出现问题,因为堆栈变量在创建时不会自动清零。

我认为我可以使用记录构造函数将记录归零,但记录构造函数不能是无参数的。大概这意味着您不能强制在堆栈上创建记录时自动执行记录构造函数。

我怀疑我的问题的答案是“无法完成”。请证明我错了!

【问题讨论】:

    标签: delphi delphi-xe2


    【解决方案1】:

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

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

    【讨论】:

    • 不错。我总是喜欢让编译器让你的生活更轻松。
    • @MarjanVenema,知道一些技巧总是好的。但是能够在记录上声明初始化/完成例程应该在几年前就已经实现了。见QC21729 Record Operator Overloading: Please implement "Initialize" and "Finalize" operators。我想补充一点,所有内在过程也应该能够用于具有类运算符的记录。我的意思是复制、高、低、长度、设置长度等。
    • 为了记录,我用 AnsiString 替换了指针(因为那是数据的实际内容)。我最初使用了一个指针,因此它可以在记录的变体部分(字符串不能)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2017-02-24
    • 2017-09-24
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多