gpt4 book ai didi

delphi - 在 Delphi 中使用指针

转载 作者:行者123 更新时间:2023-12-03 14:55:01 25 4
gpt4 key购买 nike

我已经开发了一段时间了,到目前为止我的开发中还没有使用过指针。

那么指针有什么好处呢?应用程序运行速度更快还是使用更少的资源?

因为我确信指针很重要,所以你能给我“指点”一些文章吗?这些文章很基础,但对于开始在 Delphi 中使用指针很有帮助? Google 给了我太多、太特别的结果。

最佳答案

指针是指向一 block 内存的变量。优点是:

  • 你可以给那 block 内存指定你想要的大小。
  • 您只需更改指针以指向不同的内存块,这可以节省大量复制时间。

Delphi 使用了大量的隐藏指针。例如,如果您正在使用:

var
myClass : TMyClass;
begin
myClass := TMyClass.Create;

myClass 是指向该对象的指针。

另一个例子是动态数组。这也是一个指针。

要了解有关指针的更多信息,您需要了解有关内存的更多信息。每条数据可以存在于不同的数据中。

例如全局变量:

unit X;

interface

var
MyVar: Integer;

数据段中定义了全局变量。数据段是固定的。在程序的生命周期中,这些变量都是可用的。这意味着该内存不能用于其他用途。

局部变量:

procedure Test;
var
MyVar: Integer;

堆栈上存在局部变量。这是一 block 用于内务管理的内存。它包含函数的参数(好吧,有些参数放在寄存器中,但这现在并不重要)。它包含返回地址,以便CPU知道程序结束后返回哪里。它包含函数中使用的局部变量。局部变量仅在函数的生命周期内存在。如果函数结束,则无法以可靠的方式访问局部变量。

堆变量:

procedure Test2;
var
MyClass: TMyClass;
begin
MyClass := TMyClass.Create;

变量 MyClass 是一个指针(它是在堆栈上定义的局部变量)。通过构造一个对象,您可以在堆上分配一 block 内存(不用于程序和堆栈的大块“其他”内存)。变量MyClass包含了这 block 内存的地址。堆变量一直存在,直到您释放它们为止。这意味着如果您退出函数 Test2 而不释放该对象,该对象仍然存在于堆中。但您将无法访问它,因为地址(变量 MyClass)已消失。

最佳实践

几乎总是最好在同一级别分配和释放指针变量。

例如:

var
myClass: TMyClass;
begin
myClass := TMyClass.Create;
try
DoSomething(myClass);
DoSomeOtherthing(myClass);
finally
myClass.Free;
end;
end;

如果可以的话,尽量避免使用返回对象实例的函数。永远无法确定调用者是否需要处置该对象。这会导致内存泄漏或崩溃。

关于delphi - 在 Delphi 中使用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/595177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com