delphi - 如何跟踪双指针使用错误

标签 delphi pointers

最近,我已经将大量的C ++代码形式移植到Delphi(超过1mb的C代码)。该代码充满了指针。尽管项目编译在99%的时间内都能正常工作,但我有时还是会看到一些奇怪的结果,这使我认为指针处理可能存在错误-实际上,我已经找到了一些。问题在于,如果没有编译器的任何提示/提示,它们真的很难被追踪。

对于这种情况,也许您有一些技巧:

var
  a: PSingle;

GetMem(a, SizeOf(Single));

a^ := 1.1;

// Call func declared as - someFunc(aIn: PSingle);

someFunc(@a); // <<-- Bug here. I mistakely added @ while porting. 
              // someFunc needs PSingle, but gets a PPSingle instead


在示例中,插入了错误的@。程序不会崩溃,仅处理该错误数据并保持运行。我需要一种找到传递“指向值的指针”而不是“指向值的指针”的情况的方法。

您如何跟踪此类指针错误?

最佳答案

“类型化@运算符”编译器选项旨在准确检测此类错误。禁用后,表达式@a的类型为Pointer,与所有指针类型兼容。启用该选项,并且同一表达式的类型为^PSingle,它与预期的PSingle不兼容。

我建议在所有项目中都启用该选项。让我感到困惑的是,Delphi一直没有将该选项设置为默认选项。

您可以使用$T+$T-编译器指令在代码中修改该选项的状态。



您可以做的另一件事是将代码转换为使用更惯用的Delphi。例如,通过引用而不是指针值传递参数。更改参数的定义:

procedure someFunc(var arg: Single);


使用该声明,传递@a将是编译器将发现并禁止的错误。您可以改为传递a^,或者甚至可以完全摆脱指针,而只需将a声明为普通的Single而不是PSingle

仅仅因为原始代码是用C和C风格的C ++编写的,并不意味着您的Delphi代码必须看起来像它。

关于delphi - 如何跟踪双指针使用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27602515/

相关文章:

c++ - 程序计算错误,类型转换

Delphi:使组件对实时绑定(bind)可见

c# - 如何在 C# 中模拟 Delphi 2007 SecondsBetween 函数?

delphi - 抽象方法的默认实现

delphi - Delphi中如何将整数转换为 float ?

c - 函数总是返回指向 null 的指针

c - 在这些声明下,以下表达式是什么类型,它们是否正确?

c++ - 如何将 Struct 的特定元素存储到指针中

delphi - 如何创建类似信息亭的 UI,以便用户永远无法退出它或切换到另一个应用程序?

c++ - 作为模板参数的指针 vector