还是关于指针,该怎么解决
还是关于指针
type
Puser = ^TUser;//用户信息
TUser = packed record
UserId:string;
username: string;
end;
type
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 user:Puser;
begin
GetMem(user,sizeof(user));
user.UserId := 'aabb';
ShowMessage(user.UserId);访问方式A
ShowMessage(user^.UserId);访问方式B
user^.UserId := 'ssss';
ShowMessage(user.UserId);
ShowMessage(user^.UserId);
FreeMem(user);
end;
A和B都可以设置USERID的值,两种访问有什么区别?
或者说什么情况下用第一种访问方式?什么情况用第二种?
------解决方案--------------------
个人写法习惯,记录没有^,记录指针可有可无
记录指针没加的时候编译器会帮你加上,所以最好是加上^,方便辩认是指针类型
------解决方案--------------------
嗯 delphi 中的类 T** =class 其实也是指针,但是也是用个点 来实现的. 这点感觉上不够严谨
------解决方案--------------------
楼主代码有问题。
1. GetMem(user,sizeof(user));
应当是SizeOf(TUser),你的sizeof(user)是4而不是8,你看看。
2. 在FreeMem之前,应当调用user^.UserId:=''来释放掉字符串,不然会造成内存泄漏。
可以使用New和Dispose来代替GetMem和FreeMem,这样就不用手动释放字符串了。
type
Puser = ^TUser;//用户信息
TUser = packed record
UserId:string;
username: string;
end;
type
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 user:Puser;
begin
GetMem(user,sizeof(user));
user.UserId := 'aabb';
ShowMessage(user.UserId);访问方式A
ShowMessage(user^.UserId);访问方式B
user^.UserId := 'ssss';
ShowMessage(user.UserId);
ShowMessage(user^.UserId);
FreeMem(user);
end;
A和B都可以设置USERID的值,两种访问有什么区别?
或者说什么情况下用第一种访问方式?什么情况用第二种?
------解决方案--------------------
个人写法习惯,记录没有^,记录指针可有可无
记录指针没加的时候编译器会帮你加上,所以最好是加上^,方便辩认是指针类型
------解决方案--------------------
嗯 delphi 中的类 T** =class 其实也是指针,但是也是用个点 来实现的. 这点感觉上不够严谨
------解决方案--------------------
楼主代码有问题。
1. GetMem(user,sizeof(user));
应当是SizeOf(TUser),你的sizeof(user)是4而不是8,你看看。
2. 在FreeMem之前,应当调用user^.UserId:=''来释放掉字符串,不然会造成内存泄漏。
可以使用New和Dispose来代替GetMem和FreeMem,这样就不用手动释放字符串了。