求救,在线等待,dll中指针在其调用的exe释放问题(50分)

  • 主题发起人 主题发起人 world793
  • 开始时间 开始时间
W

world793

Unregistered / Unconfirmed
GUEST, unregistred user!
我在dll中定义了一个链表结构
pback=^Tback
Tback=record
id:pchar;
data:pchar;
next:pback;
end;
其中一个过程作如下处理
procedure getdata;
var pt:pback;
begin
new(pt);
pt^.id:=pchar('0012345');
pt^.data:=pchar('36548');
pt^.next:=nil;
sendmessage(winhandle,wm_mymessage,WPARAM(pt),0);
freeback(pt);
end;
在exe程序当中也定义了一个和pback链表结构(其类型与dll中相同),在窗体消息处理过程如下
WndProc(var Message: TMessage)
var back:pback;
begin
case message.message of
wm_mymessage:begin
back:=pointer(Message.wParam);
showmessage(back^.data);
freeback(back);
end;
end;
我在dll和exe中分别定义了如下释放链表的过程
procedure freeback(var p:pback);
var q:pback;
begin
while p<>nildo
begin
q:=p;
p:=p^.next;
dispose(q);
end;
end;
但是执行exe文件时老是报错提示 invalid pointer operation;
当我去掉dll中的freeback(pt)时,再调试exe程序,前5-6次程序可以正常执行,但随后就出现错误Access violation at address 。。。。。。的错误,请问该如何处理阿
 
哪个建立的就哪个释放.
楼主可能是exe和dll中都释放了所以会出错.
 
第一种错误是“无效指针”由于你释放完指针后再次释放,实际该指针已经不存在了。
第二种错误是“指针地址冲突”由于你使用完指针后没及时释放,再次使用指针时还向该地址写入数据,因为内存保护机制不允许直接覆盖,所以报出错误地址。
解决方法:指针使用后一定要及时释放,但一定要[建立--释放]就象[begin
---end]一样都是一对一成对出现,不应该到处就释放,而是不用了就释放(记得释放一次)。
 
wanchi 按照你的说法,我把链表指针在dll中释放,但是我打开,任务管理器,查看内存使用情况,当建立一个指针,使用内存就增加,操作完毕我释放掉指针,但是从观察来看,内存根本没有减少,一直都往上加阿
 
后退
顶部