链表中的数组如何释放的问题

山娃马小三儿 2010-12-20 10:23:58
type
TArrayByte =Array of Array of Byte;

//定义数据结构
PTOnLineMeter =^TOnlineMeter;
TOnLineMeter =packed record
SocketID :TSocket;
CommandData :TArrayByte;
end;
//定义一个TList
OnLineMeterList_GPRS
//new一个结构
POnLineMeter :PTOnLineMeter;
New(POnLineMeter);
SetLength(POnLineMeter^.CommandData, sizeof(ArrayTemp)); //ArrayTemp另外定义的TArrayByte变量
Move(ArrayTemp, POnLineMeter^.CommandData, sizeof(ArrayTemp));
OnLineMeterList_GPRS.Add(POnLineMeter);

//释放
for i :=OnLineMeterList_GPRS.Count -1 downto 0 do
begin
if delSocket =PTOnLineMeter(OnLineMeterList_GPRS.Items[i])^.SocketID then
begin
//SetLength(PTOnLineMeter(OnLineMeterList_GPRS.Items[i])^.CommandData, 0);
//PTOnLineMeter(OnLineMeterList_GPRS.Items[i])^.CommandData :=Nil;
Dispose(PTOnLineMeter(OnLineMeterList_GPRS.Items[i]));
OnLineMeterList_GPRS.Delete(i);
end;
end;

Dispose(PTOnLineMeter(OnLineMeterList_GPRS.Items[i]));这一句运行的时候报无效指针,我猜大概是这个数组造成的,因为如果在new的时候,不给这个数组赋值,就能正常释放。释放前面两句代码,注销与不注销都报错
...全文
68 点赞 收藏 4
写回复
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyfhz 2010-12-23
用Length啊
回复
bdmh 2010-12-20
你这两行代码简单测试了一下,没出错,不知道你还有什么其他代码,对列表里保存的指针做了其他的操作
回复
[Quote=引用 2 楼 seamour 的回复:]
这两句的代码根本就不是你想要的

Delphi(Pascal) code

SetLength(POnLineMeter^.CommandData, sizeof(ArrayTemp)); //ArrayTemp另外定义的TArrayByte变量
Move(ArrayTemp, POnLineMeter^.CommandData, sizeof(ArrayTemp));


Siz……
[/Quote]

请问对于数组怎么赋值比较合适啊,你说的这种情况我也听别人讲起过,但是不知道该如何处理
回复
Seamour 2010-12-20
这两句的代码根本就不是你想要的

SetLength(POnLineMeter^.CommandData, sizeof(ArrayTemp)); //ArrayTemp另外定义的TArrayByte变量
Move(ArrayTemp, POnLineMeter^.CommandData, sizeof(ArrayTemp));

SizeOf(ArrayTemp) 永远是4
动态数组的生存期是自动管理的,只有用“:=”才能保证不会出错。像你这里用 Move 是强行覆盖,引用计数不会增加。在你 Dispose 之前,TArrayByte 成员早就被释放过了,再去释放当然是无效指针了。

另外,由于动态数组是引用类型,从你这里的代码水平看,很难保证在复制 ArrayTemp 时,每一个元素都不是浅复制,很可能还会遇到其它问题
回复
发动态
发帖子
语言基础/算法/系统设计
创建于2007-08-02

1.6w+

社区成员

Delphi 语言基础/算法/系统设计
申请成为版主
社区公告
暂无公告