- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我只是想知道,为什么大多数 Delphi 示例都使用 FillChar() 来初始化记录。
type
TFoo = record
i: Integer;
s: string; // not safe in record, better use PChar instead
end;
const
EmptyFoo: TFoo = (i: 0; s: '');
procedure Test;
var
Foo: TFoo;
s2: string;
begin
Foo := EmptyFoo; // initialize a record
// Danger code starts
FillChar(Foo, SizeOf(Foo), #0);
s2 := Copy("Leak Test", 1, MaxInt); // The refcount of the string buffer = 1
Foo.s = s2; // The refcount of s2 = 2
FillChar(Foo, SizeOf(Foo), #0); // The refcount is expected to be 1, but it is still 2
end;
// After exiting the procedure, the string buffer still has 1 reference. This string buffer is regarded as a memory leak.
这里(http://stanleyxu2005.blogspot.com/2008/01/potential-memory-leak-by-initializing.html)是我关于这个主题的注释。 IMO,声明一个具有默认值的常量是一个更好的方法。
最佳答案
主要是历史原因。 FillChar() 可以追溯到 Turbo Pascal 时代并用于此类目的。这个名字确实有点用词不当,因为虽然它说的是 FillChar(),但它实际上是 FillByte()。原因是最后一个参数可以采用字符或字节。因此 FillChar(Foo, SizeOf(Foo), #0) 和 FillChar(Foo, SizeOf(Foo), 0) 是等效的。另一个令人困惑的来源是,截至 Delphi 2009,FillChar 仍然只填充字节,即使 Char 相当于 WideChar。在查看 FillChar 最常见的用途时,为了确定大多数人是否使用 FillChar 来实际用字符数据填充内存,或者只是用它来用某个给定的字节值初始化内存,我们发现后一种情况主导了它的使用而不是前者。因此,我们决定保持 FillChar 以字节为中心。
确实,如果未在正确的上下文中使用,则使用 FillChar 清除包含使用“托管”类型之一(字符串、变体、接口(interface)、动态数组)声明的字段的记录可能是不安全的。然而,在您给出的示例中,对本地声明的记录变量调用 FillChar 实际上是安全的,只要这是您对该范围内的记录执行的第一件事即可。原因是编译器已生成代码来初始化记录中的字符串字段。这已经将字符串字段设置为 0 (nil)。调用 FillChar(Foo, SizeOf(Foo), 0) 只会用 0 个字节覆盖整个记录,包括已经为 0 的字符串字段。在将值分配给记录变量后使用 FillChar字符串字段,不推荐。使用初始化常量技术是这个问题的一个很好的解决方案,因为编译器可以生成正确的代码以确保现有的记录值在赋值期间正确完成。
关于delphi - 为什么大多数 Delphi 示例使用 FillChar() 来初始化记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/783825/
这个词有它 FillChar 是用相同值的字节填充内存补丁的最快方法(不是零,因为有 ZeroMemory),但是是否有等效于用相同的序列填充内存(四字节)整数或基数?像 FillInt 或 Fill
考虑我的示例代码: var p512Sector:PByte; ..... getmem(p512Sector, 262144); FillChar( p512Sector,262144 ,0); 当
是否有任何特殊原因需要使用 FillChar 初始化 Delphi Integer 变量,而不是仅仅为其分配初始值?我遇到过如下代码。它不在速度敏感循环或任何东西中。在这里使用 FIllChar,尤其
假设您有一条想要初始化的本地记录: type TMyRec=record Val1, Val2:Integer; end; procedure MyProc; var MyVar:
以下代码应该可以编译并且确实可以与许多其他类型一起编译。 但是,编译器报告“常量对象无法作为 var 参数传递”错误 - 尽管变量显然是一个变量。 program CurrencyConstant;
我只是想知道,为什么大多数 Delphi 示例都使用 FillChar() 来初始化记录。 type TFoo = record i: Integer; s: string; //
Delphi 的 FillChar 在 C# 中的等效项是什么? 最佳答案 我假设您想用零填充一个字节数组(因为这就是 FillChar 在 Delphi 中最常用的方法)。 .NET 保证在创建时将
我对 Delphi 10.2 Pascal 编程语言中的特定编程问题有疑问。 StringOfChar 和 FillChar 在 2012 年之前发布的 CPU 上的 Win64 版本构建下无法正常工
这是我的整个 init.vim 文件(目前只是试图让它工作 - 一旦主要目标正常工作,我将删除不必要的代码)。 我面临的问题: 一旦我折叠了我的代码部分,我就无法摆脱尾随的 -'s。 Fold 的 x
我是一名优秀的程序员,十分优秀!