一直提示“Invalid pointer operation” ( 积分: 100 )

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

soniczhuang

Unregistered / Unconfirmed
GUEST, unregistred user!
我在ListView的SelectItem事件中,来显示Item.Data的数据。在插入数据时使用的是^Integer,连续点击不同的行,在点击第三次时就出现“Invalid pointer operation”。
大家帮我看看是什么问题。代码如下:
procedure TSysMemberSet.MemberDataSelectItem(Sender: TObject;
Item: TListItem; Selected: Boolean);
var
PrimaryKey : ^Integer;
begin
if (not Selected) or (Item.Data = nil) or (Item.Index < 0) then Exit;

try
New(PrimaryKey);
PrimaryKey := Item.Data;
LblMemberID.Caption := IntToStr(PrimaryKey^);
finally
Dispose(PrimaryKey);
end;
end;
 
procedure TSysMemberSet.MemberDataSelectItem(Sender: TObject;
Item: TListItem; Selected: Boolean);
var
PrimaryKey : ^Integer;
begin
if (not Selected) or (Item.Data = nil) or (Item.Index < 0) then Exit;

try
New(PrimaryKey);
PrimaryKey := Item.Data;
LblMemberID.Caption := IntToStr(PrimaryKey^);
finally
Dispose(PrimaryKey);
end;
end;
1。不会使用指针最好不要使用啊!
Dispose(PrimaryKey); //这句会把Item.Data 指针释放了! 如果你获取他就是 "Invalid pointer operation " 的错误!
2。 New(PrimaryKey); 然后 PrimaryKey := Item.Data;
那么PrimaryKey 所占用的空间就泄漏了。
3。 可以这样改正
procedure TSysMemberSet.MemberDataSelectItem(Sender: TObject;
Item: TListItem; Selected: Boolean);
var
PrimaryKey : ^Integer;
begin
if (not Selected) or (Item.Data = nil) or (Item.Index < 0) then Exit;
begin
PrimaryKey := PInteger(Item.Data);
LblMemberID.Caption := IntToStr(PrimaryKey^);
end;
end;
 
难道使用指针时不需要申请内存?
 
因为你之前的指针是被引用的! 所以不用再分配空间了。 如果你再配那只能把指针所指向的值付给你已经分配的指针。 要不然就是指针引用了。 现在不明白以后会明白的。
 
哈哈,明白了,在读取指针时不需要再分配空间,因为已经分配,kk2000,是这个意思吧?
 
后退
顶部