【问题标题】:Delphi object reference modelDelphi 对象参考模型
【发布时间】:2017-05-28 13:08:52
【问题描述】:

我试图准确了解 Delphi 是如何管理内存的,我从 Marco Cantu 那里读到它像 Java 一样使用引用。

我知道一个变量(比如说var theObj: TSomeClass;)持有一个引用(=一个指针)来指示存储对象的内存位置。因此,当我调用theObj 的构造函数时,我在堆上创建类,然后 theObj 是指向新创建位置的指针。


到目前为止一切都很好,但现在我有疑问了。他说:

在某些 OOP 语言中,声明类类型的变量会创建一个 该类的实例。

这是否意味着涉及指向内存位置的指针?我的猜测是,您在这里声明了一个变量,它直接创建对象而不使用堆。那么这个变量是不是只在栈上创建,并且保存了类的所有数据呢?


注意。上面的猜测和问题是因为我与C++进行了比较。

  • 德尔福:theObj := TSomeClass.Create
  • C++:TSomeClass *theObj = new TSomeClass;

不要偏离主题并谈论 C++(这只是作为示例,我只知道这种语言来进行比较)但是在这两种情况下,我都在堆中创建对象并且我有一个指向它的指针。我上面提出的第二个问题是因为这个:在 C++ 中,我也可以创建一个像 TSomeClass theObj; 这样的对象,它会一直存在到函数范围的末尾。

在德尔福我不能。我认为当他说“声明一个类类型的变量会创建该类的一个实例”时,marco 指的是这个。我说的对吗?

【问题讨论】:

  • 我想你可能读错了,当他说“在某些 OOP 语言中,声明一个变量......”时,他正在区分这些语言和 Delphi。在接下来的句子中,他说“相反,Delphi 基于对象参考模型。请注意 instead.

标签: delphi memory-management


【解决方案1】:

Marco 正在考虑 C++,其中类和结构本质上是相同的,但默认可访问性不同。在 C++ 中

SomeClass obj;

创建对象。

您无需担心。如第二段所述,您的理解是无可挑剔的。一个类类型的 Delphi 变量实际上只是一个指向实例的指针。

【讨论】:

  • 这花了我 2 天的时间,感谢您的确认,现在我知道它是正确的。我看到 Delphi 和 C++ 都使用指向内存的指针,但 C++ 还有另一种创建对象的方法,他指的是它。非常感谢你!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 2023-01-09
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多