请大家看看这个问题,这段程序为什么能运行?
在 TForm1.Button1Click 函数中,我声明了一个ttest类型的变量,未初始化,但运行成功。希望高手能帮我解释一下,我刚用delphi,谢谢了。(详见代码)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TTest = class;
TTest = class(TObject)
public
i: integer;
procedure test;
constructor Create;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
test1: TTest;
begin
// 未初始化,为什么可以继续执行。
// test1 := TTest.Create;
test1.test;
test1.i :=5;
showmessage(inttostr(test1.i));
end;
{ TTest }
constructor TTest.Create;
begin
// abort;
end;
procedure TTest.test;
begin
showmessage('hello, world!');
end;
end.
我很奇怪,为什么不初始化也能运行???????
经过试验,我得出如下结论,请指教
如果不初始化,delphi也会分配一块内存,不过此内存是只读的。
1. 当test类中有成员变量字段时,如果对成员变量赋值,退出程序时才会报错。报内存只读错误。如果有成员变量,但没有赋值,也不会报错。
2. 如果当test类中没有成员变量字段,可以正常运行,且不报错。
3. 如果test类型的变量声明成临时变量与全局变量,其分配内存的方式是不一样的。全局变量,不为类中的字段变量分配内存。临时变量,为类中的字段变量分配内存,不过是只读的,但在赋值时不会出错,在退出程序时才报错。
各位高手验证一下我得出的结论,看看对不对。也请帮我详细解释一下delphi的内存分配机制。为什么不分配内存也可以执行方法?为什么不报错?