关于类和指针的一个简单问题,请指导一下 ( 积分: 200 )

  • 主题发起人 主题发起人 sephy
  • 开始时间 开始时间
S

sephy

Unregistered / Unconfirmed
GUEST, unregistred user!
全局变量pb: pBuffs
类型pBuffs=^TBuff;
TBuff有字串类型属性Str

procedure TForm1.Button6Click(Sender: TObject);
var newBuf:TBuff;
begin
newBuf:=TBuff.Create;
pB:=@newBuf;
pB^.Str:='ABC';
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
Form1.Caption:=pB^.Str

end;

Form1.Caption不能如愿显示ABC

是因为newBuf的生存周期在button6click过程中就结束了,而引起的问题嘛?
Delphi不是不自动释放对象的么? 我并没有free过啊?
如果要动态生成一个类,并要得到其指针应该怎么做? pB:=@(TBuff.Create)是不行的
 
全局变量pb: pBuffs
类型pBuffs=^TBuff;
TBuff有字串类型属性Str

procedure TForm1.Button6Click(Sender: TObject);
var newBuf:TBuff;
begin
newBuf:=TBuff.Create;
pB:=@newBuf;
pB^.Str:='ABC';
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
Form1.Caption:=pB^.Str

end;

Form1.Caption不能如愿显示ABC

是因为newBuf的生存周期在button6click过程中就结束了,而引起的问题嘛?
Delphi不是不自动释放对象的么? 我并没有free过啊?
如果要动态生成一个类,并要得到其指针应该怎么做? pB:=@(TBuff.Create)是不行的
 
你定义的是局部的变量
定义为单元的全局
或者工程的全局就可以了
 
因为我实际上还想用指针的动态数组
所以需要 类运行时多次产生, 并放到动态数组中
一定要开一个对应的类的动态数组么? 不能只存在指针么?
 
是因为newBuf的生存周期在button6click过程中就结束了,而引起的问题嘛?
Delphi不是不自动释放对象的么? 我并没有free过啊?
如果要动态生成一个类,并要得到其指针应该怎么做? pB:=@(TBuff.Create)是不行的
---------------------------------
1。会有问题。随机性的。
2。如果对象是接口的话会自动根据计数释放。否则要手工释放
3。Delphi中类类型变量本身就是指针。直接pB:=TBuff.Create;就行了
 
不管你开指针还是指针的动态数组都不能在TForm1.Button6Click里创建,在TForm1.Button6Click里只能赋值,否则TForm1.Button6Click运行结束就全被释放掉啦:)
 
record是会被自动释放的,因为他们被分配在堆栈当中,他们并不是类的对象实例.继承自TObject是不会被自动释放的.
 
newbuf被释放掉了,但是newbuf指向的类实例没有被释放。
呵呵,其实newbuf也没有被释放,因为它本来就在堆栈中,只不过被破坏了而已

记住啊,delphi中的对象变量其实是c++中的对象指针变量。 所以newbuf其实是个指针。
而你的pb实际是个指针的指针。
 
我想是这样的:
Delphi 只知道 pb 是一个 pBuffs 指针,而不知道是 pBuffs是TBuffs
所以应该写成: form1.caption := TBuffs(pb^).Str
 
后退
顶部