Lit*_*per -2 delphi oop constructor
显然,我不明白构造函数是如何工作的.
当我的应用程序启动时,它会自动或在需要时执行我的程序来加载所有资源 - 主要是图像.
procedure Load;
begin
AppPath := GetAppPath;
INI := TInIFile.Create(AppPath + '\Config.ini');
INI.WriteBool('Application', 'Running', True);
ResPath := AppPath + '\Resources';
Top := TPicture.Create;
TopRight := TPicture.Create;
Left := TPicture.Create;
Right := TPicture.Create;
BottomLeft := TPicture.Create;
Bottom := TPicture.Create;
BottomRight := TPicture.Create;
...
//Load the pictures ...LoadFromFile(Skin.ReadString('Skin', ..., ...));
Run Code Online (Sandbox Code Playgroud)
当我使用这个应用程序时,它开始有点滞后,但操作系统开始冻结和滞后.当我在任务管理器中看到我的程序时,我感到很震惊:

如果我是对的,应用程序使用600兆内存,包含页面文件.我的系统只有1 GB的RAM,因此难怪操作系统和几乎每个程序都因页面文件的使用而开始滞后.
原来这是每次我做某事时加载资源的相同程序.我通过向单元添加布尔值来修复它,并且当它被设置为true时取消了该过程(意味着加载了资源).
Loaded: Boolean;
...
if Loaded = False then Load;
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我必须做出改变.为什么构造函数首先为已经创建的对象分配内存?
Rob*_*edy 11
构造函数仅在对象尚不存在时分配内存.如果在现有对象上调用构造函数,则构造该对象; 没有分配新的.(什么你决定做内部构造则是另一回事.这些指令可能除了无论分配更多的内存InstanceSize为类函数返回.)
但是,您的代码不会显示在现有对象上调用的任何构造函数.您在类上调用构造函数,并为每个类分配一个新实例.例如,您构造一个INI文件对象:
INI := TInIFile.Create(AppPath + '\Config.ini');
Run Code Online (Sandbox Code Playgroud)
这会调用构造函数TIniFile.它分配一个新TIniFile实例并初始化它.完成后,对该新对象的引用将存储在INI变量中.要实现的重要一点是,如果INI已经对某个其他对象进行了引用,则该引用将被丢弃,而新引用将被存储INI.您没有TIniFile在已经引用的对象上调用构造函数INI.该对象完全独立于正在创建的新对象.
该INI变量不是TIniFile对象.它是对象的引用.
你显然是Load多次调用你的函数.每次调用它时,都会重新运行之前运行的所有对象构造函数.您有内存泄漏,因为每次构造一组新对象时,都会在已存储前一个对象引用的相同变量中存储对它们的引用.之前的值被丢弃,并且无法将它们恢复,所以没有办法解放他们.解决这个问题的方法如下所示:确保只通过跟踪是否已经加载来初始化程序.
| 归档时间: |
|
| 查看次数: |
319 次 |
| 最近记录: |