莫名其妙的问题!愁死了!关于自定义链表,创建和删除的问题! ( 积分: 100 )

  • 主题发起人 主题发起人 hitppcat
  • 开始时间 开始时间
H

hitppcat

Unregistered / Unconfirmed
GUEST, unregistred user!
调用函数运行一段时间后,总是出现invalid&nbsp;pointer&nbsp;和access&nbsp;violation&nbsp;之类的错误,经过层层调试,我可以确定是链表操作产生的异常,但是在抛出异常之前数次执行相同的操作都没问题。高手一定要帮忙啊!程序中我调用了GetIpNetTable这个api函数来获得arp缓存表内容。<br>//自定义链表数据结构<br>type<br>&nbsp;&nbsp;PTArpRow=^TArpRow;<br>&nbsp;&nbsp;TArpRow=record<br>&nbsp;&nbsp;&nbsp;&nbsp;dwIndex:DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;dwIP:DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;sMac:string;<br>&nbsp;&nbsp;&nbsp;&nbsp;pNext:PTArpRow;<br>&nbsp;&nbsp;end;<br>//创建函数<br>&nbsp;procedure&nbsp;GetArpTable(var&nbsp;iEntries:UINT;var&nbsp;aTable:PTArpRow);<br>&nbsp;&nbsp;var<br>&nbsp;&nbsp;&nbsp;&nbsp;ipTable:MIB_IPNETTABLE;<br>&nbsp;&nbsp;&nbsp;&nbsp;dwSize:DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;i:UINT;<br>&nbsp;&nbsp;&nbsp;&nbsp;par:PTArpRow;<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;dwSize:=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;aTable:=nil;<br>&nbsp;&nbsp;&nbsp;&nbsp;iEntries:=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetIpNetTable(nil,dwSize,true)=ERROR_INSUFFICIENT_BUFFER&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetIpNetTable(@ipTable,dwSize,true)=NO_ERROR&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;ipTable.dwNumEntries=0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i:=0&nbsp;to&nbsp;ipTable.dwNumEntries-1&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;ipTable.table.dwType=4&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new(par);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iEntries:=iEntries+1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;par.dwIndex:=ipTable.table.dwIndex;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;par.dwIP:=ipTable.table.dwAddr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;par.sMac:=MacToStr(@(ipTable.table.bPhysAddr),6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;par.pNext:=aTable;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aTable:=par;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;<br>//清除函数<br>procedure&nbsp;CleanParMem(var&nbsp;pr:PTArpRow);<br>&nbsp;var<br>&nbsp;&nbsp;tmpr:PTArpRow;<br>&nbsp;begin<br>&nbsp;&nbsp;if&nbsp;pr=nil&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;exit;<br>&nbsp;&nbsp;while&nbsp;pr&lt;&gt;nil&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;tmpr:=pr;<br>&nbsp;&nbsp;&nbsp;&nbsp;pr:=tmpr.pNext;<br>&nbsp;&nbsp;&nbsp;&nbsp;dispose(tmpr);<br>&nbsp;&nbsp;end;<br>&nbsp;end;<br>//调用函数<br>procedure&nbsp;test;<br>var<br>&nbsp;&nbsp;&nbsp;&nbsp;tmpat:PTArpRow;<br>&nbsp;&nbsp;&nbsp;&nbsp;iarn:UINT;<br>begin<br>tmpat:=nil;<br>while&nbsp;(true)do<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetArpTable(iarn,tmpat);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CleanParMem(tmpat);<br><br>end;<br>end;
 
//自定义链表数据结构<br>type<br>&nbsp;&nbsp;PTArpRow&nbsp;=&nbsp;^TArpRow;<br>&nbsp;&nbsp;TArpRow&nbsp;=&nbsp;record<br>&nbsp;&nbsp;&nbsp;&nbsp;dwIndex:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;dwIP:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;sMac:&nbsp;string;<br>&nbsp;&nbsp;&nbsp;&nbsp;pNext:&nbsp;PTArpRow;<br>&nbsp;&nbsp;end;<br>//创建函数<br><br>procedure&nbsp;GetArpTable(var&nbsp;iEntries:&nbsp;UINT;&nbsp;var&nbsp;aTable:&nbsp;PTArpRow);<br>var<br>&nbsp;&nbsp;ipTable:&nbsp;PMibIpNetTable;&nbsp;//用指针MibIpNetTable结构里有一个Array[0..0]的数组,就是为了不确定长度,动态分配,越界访问数组元素<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//你原来的之所以有时候不出错,是访问的栈里面随机内存,就会有时候报错,有时候不报错<br>&nbsp;&nbsp;dwSize:&nbsp;DWORD;<br>&nbsp;&nbsp;i:&nbsp;UINT;<br>&nbsp;&nbsp;par:&nbsp;PTArpRow;<br>begin<br>&nbsp;&nbsp;dwSize&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;aTable&nbsp;:=&nbsp;nil;<br>&nbsp;&nbsp;iEntries&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;if&nbsp;GetIpNetTable(nil,&nbsp;dwSize,&nbsp;true)&nbsp;=&nbsp;ERROR_INSUFFICIENT_BUFFER&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;GetMem(ipTable,&nbsp;dwSize);//分配内存<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetIpNetTable(ipTable,&nbsp;dwSize,&nbsp;true)&nbsp;=&nbsp;NO_ERROR&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;ipTable.dwNumEntries&nbsp;=&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;0&nbsp;to&nbsp;ipTable.dwNumEntries&nbsp;-&nbsp;1&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;ipTable^.table.dwType&nbsp;=&nbsp;4&nbsp;then&nbsp;//实际上这里都是越界访问<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new(par);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iEntries&nbsp;:=&nbsp;iEntries&nbsp;+&nbsp;1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;par.dwIndex&nbsp;:=&nbsp;ipTable^.table.dwIndex;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;par.dwIP&nbsp;:=&nbsp;ipTable^.table.dwAddr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;par.sMac&nbsp;:=&nbsp;MacToStr(@(ipTable^.table.bPhysAddr),&nbsp;6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;par.pNext&nbsp;:=&nbsp;aTable;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aTable&nbsp;:=&nbsp;par;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;FreeMem(ipTable);//释放内存<br>&nbsp;&nbsp;end;<br>end;<br>//清除函数<br><br>procedure&nbsp;CleanParMem(var&nbsp;pr:&nbsp;PTArpRow);<br>var<br>&nbsp;&nbsp;tmpr:&nbsp;PTArpRow;<br>begin<br>&nbsp;&nbsp;if&nbsp;pr&nbsp;=&nbsp;nil&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;exit;<br>&nbsp;&nbsp;while&nbsp;pr&nbsp;&lt;&gt;&nbsp;nil&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;tmpr&nbsp;:=&nbsp;pr;<br>&nbsp;&nbsp;&nbsp;&nbsp;pr&nbsp;:=&nbsp;tmpr.pNext;<br>&nbsp;&nbsp;&nbsp;&nbsp;dispose(tmpr);<br>&nbsp;&nbsp;end;<br>end;<br>//调用函数<br><br>procedure&nbsp;test;<br>var<br>&nbsp;&nbsp;tmpat:&nbsp;PTArpRow;<br>&nbsp;&nbsp;iarn:&nbsp;UINT;<br>&nbsp;&nbsp;I:Integer;<br>begin<br>&nbsp;&nbsp;tmpat&nbsp;:=&nbsp;nil;<br>&nbsp;&nbsp;//while&nbsp;(true)&nbsp;do<br>&nbsp;&nbsp;for&nbsp;I&nbsp;:=&nbsp;0&nbsp;to&nbsp;1000&nbsp;-&nbsp;1&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;GetArpTable(iarn,&nbsp;tmpat);<br>&nbsp;&nbsp;&nbsp;&nbsp;CleanParMem(tmpat);<br>&nbsp;&nbsp;end;<br>end;
 
我改成指针后,还是老问题,上面程序创建链表时,选择arp缓存表中的静态表项保存,当arp缓存表没有静态表项时一切正常&nbsp;当我&nbsp;arp&nbsp;-s&nbsp;192.168.0.1&nbsp;00-e0-c0-33-45-54后链表进行new操作后才会出现问题
 
我用的是上面发给你的代码.没有发现问题
 
谢谢回复<br>我这边总有问题<br>问题出现在<br>&nbsp;if&nbsp;ipTable^.table.dwType&nbsp;=&nbsp;4&nbsp;then&nbsp;//实际上这里都是越界访问<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new(par);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iEntries&nbsp;:=&nbsp;iEntries&nbsp;+&nbsp;1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;par.dwIndex&nbsp;:=&nbsp;ipTable^.table.dwIndex;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;par.dwIP&nbsp;:=&nbsp;ipTable^.table.dwAddr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;par.sMac&nbsp;:=&nbsp;MacToStr(@(ipTable^.table.bPhysAddr),&nbsp;6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;par.pNext&nbsp;:=&nbsp;aTable;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aTable&nbsp;:=&nbsp;par;&nbsp;&nbsp;///////这句话加上就报错<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;FreeMem(ipTable);//释放内存
 
呵呵,指针的难搞·
 
sMac不要用string
 
/自己已经解决,感谢wr960204回复
 
后退
顶部