如何在Delphi中泄漏字符串

Jim*_*eth 11 delphi string memory-leaks

前几天我正和一位同事谈论如果你真的搞砸了,你怎么能在Delphi中泄漏字符串.默认情况下,字符串是引用计数和自动分配的,因此它们通常无需任何考虑即可工作 - 无需手动分配,大小计算或内存管理.

但我记得曾经读过有一种方法可以直接泄漏一个字符串(不包括在被泄漏的对象中).看起来它与通过引用传递字符串然后从传递给它的例程中的更大范围访问它有关.是的,我知道这很模糊,这就是为什么我在这里问这个问题.

mgh*_*hie 7

我不知道你的第二段中的问题,但我被记录中泄露的字符串咬了一次.

如果在包含字符串的记录上调用FillChar(),则用零覆盖引用计数和动态分配的内存的地址.除非字符串为空,否则会泄漏内存.解决这个问题的方法是在清除它占用的内存之前调用记录上的Finalize().

不幸的是,当没有需要最终化的记录成员时调用Finalize()会导致编译器提示.在我发生的事情中,我注释掉了Finalize()调用以使提示静音,但后来当我在记录中添加了一个字符串成员时,我错过了取消注释该调用,因此引入了泄漏.幸运的是,我通常在调试模式下使用FastMM内存管理器处于最详细和偏执的设置,因此泄漏并没有被忽视.

编译器提示可能不是一件好事,默默地省略Finalize()调用,如果不需要它会更好恕我直言.