迷惑----有关指针问题(50分)

  • 主题发起人 主题发起人 秋之叶
  • 开始时间 开始时间

秋之叶

Unregistered / Unconfirmed
GUEST, unregistred user!
type
PRec = ^TRec;
TRec = record
Name: string[12];
Id: Integer;
end;

.......
implementation
var
s: string;

{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
P: PRec;
begin
SetLength(s, SizeOf(TRec));
new(P);
P.Name := 'fanghe';
idc := idc + 1;
P.Id := idc;
move(p, s[1], SizeOf(TRec));
Dispose(P);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
P: PRec;
begin
p := new(PRec);
move(s[1], p, SizeOf(TRec));
caption := '名称:' + P.Name + ' 编号:' + inttostr(P.Id);
dispose(p);
end;

同样用到指针的两个过程,为什么第二个过程指针释放时报错?
跟move有关吗?
如果第二个过程中p改为全局变量,不在过程中释放指针,是否会造成内存泄漏?
正确的写法应该是什么?
多谢关注。
 
procedure TForm1.Button2Click(Sender: TObject);
var
P: PRec;
begin
p := new(PRec);//改成new(p)试试
move(s[1], p, SizeOf(TRec));
caption := '名称:' + P.Name + ' 编号:' + inttostr(P.Id);
dispose(p);
end;
 
修改以下两处:
move(p, s[1], SizeOf(TRec))

改为:move(p^, s[1], sizeof(TRec));

move(s[1], p, sizeof(TRec));
改为:move(s[1], p^, sizeof(TRec));

改成全局变量直接将P说明成为TRec类型,不会造成内存泄漏。
 
to 没理头号:
new(p) 等价于 p = new(PRec), 不是这里的问题
to delphi:
多谢了。另:P^应该是指指针的头字节位置吧?是不是move的时候,需要把指针的位置
回复到首字节位置才行。
你说的声明全局变量是PRec类型是吗?肯定不会造成内存泄漏?我还是不敢确定,每次
系统分配给p的地址都不同,即使它是全局变量,好像是原地址没有释放所以无法再分配。
还是要多谢你的点拨。
 
老兄是用C的吧?
请看Move的定义:
procedure Move(const Source
var Dest
Count: Integer);
其中Source和Dest参数并非指针,而是指针所指向的东东,所以应该用p^,而不是p,
与此类似的还有Stream的Read/Write等。
还有,p.Name似乎也不妥,我一向是用p^.Name
 
to 猛禽:
是指针所指的东东吗?为什么有move(s[1], s2[1], 4) ? (其中s为string) 难道s[1]不是首字节吗?
谁能把这个问题解释的更清楚些.
 
Pascal与C不一样就是有传地址和传值两种方式。
Move的定义是 procedure Move( const Source
var Dest
count : Integer );
编译器传的是地址。move(s[1], s2[1], 4) S[1]在我们的理解是S[1]这一个字符
而不是S[1]的地址,而编译认为是地址(因为const ),你试一下
procedure (a: string);
procedure (var a: string);
procedure (const a: string);
实参和形参a的地址就清楚了。
 
一般NEW的动态变量,DELPHI会自动释放,所以一般不用显示释放的。
 
to jiangxiancheng:
是不是P^就是指针P指向内容的首地址呢?Move接受的是否正是首地址呢?
指针是存在于单独的地址列表中,有不同于所指内容的地址,所以,move的对象应该是
指针所指内容而不是指针本身,这样解释对吗?
 
多人接受答案了。
 

Similar threads

后退
顶部