2017-05-28 116 views
2

我想了解Delphi如何管理內存,我從Marco Cantu那裏讀到它使用像Java這樣的引用。Delphi對象參考模型

我明白,一個變量(比如說var theObj: TSomeClass;)持有一個引用(=一個指針)來指示存儲對象的內存位置。所以當我調用theObj的構造函數時,我在堆上創建類,然後Obj是一個指向新創建位置的指針。


到目前爲止好,但現在我有疑問。他說:

在某些OOP語言中,聲明類類型的變量會創建該類的 實例。

這是否意味着指向內存位置的指針是而不是?我的猜測是,在這裏你聲明一個變量,它直接創建對象而不使用堆。那麼這個變量是否只能在堆棧上創建,並且保存了該類的所有數據?


注意。上面的猜測和問題是由於我與C++做了比較而做出的。

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

不打算偏離主題和C的交談++(這只是作爲例子,我只知道這種語言作出比較),但在這裏都在堆中創建對象的情況下,我有一個指向它的指針。我之前提出的第二個問題是因爲這個:在C++中,我也可以創建一個像這樣的對象,它將一直存在直到函數的作用域結束。

在德爾福我不能。我認爲,當他說「聲明一個類類型的變量創建該類的一個實例」時,marco指的是這樣。我對麼?

+4

我想你可能會讀他錯了,當他說「在一些OOP語言中,聲明一個變量......」時,他正在區分這些語言和Delphi。在接下來的句子中,他說:「Delphi是基於對象參考模型的。注意**代替**。 – MartynA

回答

4

Marco正在考慮C++,其中類和結構與不同的默認可訪問性基本相同。在C++中

SomeClass obj; 

創建對象。

你沒有什麼好擔心的。正如第二段所表達的,你的理解是無可挑剔的。類型類型的Delphi變量只是一個指向實例的指針。

+0

這花了我2天時間,謝謝您現在確認我知道它是正確的。 Delphi和C++都使用指向內存的東西,但C++也有另一種創建對象的方法,他指的是它。 –