首页 > 解决方案 > Tobject内存地址保留/释放

问题描述

假设我有一个 TMyobject 的实例

 MyObjectA := TMyObject.create

我们可以说 MyObjectA 是内存中的一个地址。现在如果我这样做

 MyObjectA.free

通常 MyObjectA 仍然是内存中的地址,但该地址处的内存不再保留,这就是为什么有时做 MyObjectA.aProperty 仍然有效

现在如果我这样做

 MyObjectB := TMyObject.create

是什么禁止系统将 MyObjectA 先前使用的内存地址提供给 MyObjectB ?并且以这种方式有可能在执行 MyObjectB := TMyObject.create 之后 MyobjectA 变得有效?

标签: delphi

解决方案


没有什么可以“禁止”内存管理器立即为 MyObjectB 重新使用之前由 MyObjectA 占用的内存。

没有办法(除非使用定制设计的内存管理器)可以阻止它(或强制它)这样做。

然而,这并不意味着 MyObjectA 突然变得比分配 MyObjectB 之前更“有效”。MyObjectA 的内容已经被MyObjectB 的内容(实例)彻底覆盖,因此即使内存管理器立即将之前由 MyObjectA 占用的内存重新用于 MyObjectB,它也不会突然变得比以前更“有效”。本质上,你可以做同样的事情

MyObjectB := TMyObject.Create;
MyObjectA := MyObjectB;

IE。MyObjectA 只是成为 MyObjectB 的别名(如果内存被重用),但在这种情况下,MyObjectA 的原始内容将永远丢失。


推荐阅读