网上冲浪 | 反毒杀毒 | 菜鸟进阶 | 网络安全 | 实用技术 | 网络安全 | 操作系统 |
工具软件 | 电脑医院 | 网上赚钱 | 网页制作 | 网络营销 | 经典教程 | IT趣 谈 |
当前位置:IT快活林快活林学院操作系统

自定义链表的创建和删除基本困扰我几天百思不得其解站长帮忙

自定义链表的创建和彻底删除问题!困扰了我几天,百思不得其解!It快活林的IT快活林的计算机高手帮忙!调用函数运行一段时间后,总是出现invalid pointer 和access violation 之类的错误,经过层层调试,我可以确定是链表操作产生的异常,但是在抛出异常之前数次执行相同的操作都没问题.It快活林的IT快活林的计算机高手一定要帮忙!程序(Procedures)(Procedures)中我调用了GetIpNetTable这一个api函数来获得arp缓存表内容,MacToStr为鄙人编写的一个把mac地址转成字符串的函数,经测试没有问题.

//自定义链表数据(Data)结构

type
  PTArpRow=^TArpRow;
  TArpRow=record
    dwIndex:DWORD;
    dwIP:DWORD;
    sMac:string;
    pNext:PTArpRow;
  end;
//创建函数
procedure GetArpTable(var iEntries:UINT;var aTable:PTArpRow);
  var
    ipTable:MIB_IPNETTABLE;
    dwSize:DWORD;
    i:UINT;
    par:PTArpRow;
  begin
    dwSize:=0;
    aTable:=nil;
    iEntries:=0;
    if GetIpNetTable(nil,dwSize,true)=ERROR_INSUFFICIENT_BUFFER then
    begin
      if GetIpNetTable(@ipTable,dwSize,true)=NO_ERROR then
      begin
        if ipTable.dwNumEntries=0 then
          exit;
        for i:=0 to ipTable.dwNumEntries-1 do
        begin
          if ipTable.table[i].dwType=4 then
          begin
            new(par);
            iEntries:=iEntries+1;
            par.dwIndex:=ipTable.table[i].dwIndex;
            par.dwIP:=ipTable.table[i].dwAddr;
            par.sMac:=MacToStr(@(ipTable.table[i].bPhysAddr),6);
            par.pNext:=aTable;
            aTable:=par;
          end;
        end;
      end;
    end;
  end;
//清除函数
procedure CleanParMem(var pr:PTArpRow);
var
  tmpr:PTArpRow;
begin
  if pr=nil then
    exit;
  while pr <>nil do
  begin
    tmpr:=pr;
    pr:=tmpr.pNext;
    dispose(tmpr);
  end;
end;
//调用函数
procedure test;
var
    tmpat:PTArpRow;
    iarn:UINT;
begin
tmpat:=nil;
while (true)do
    begin
      GetArpTable(iarn,tmpat);
      CleanParMem(tmpat);

end;
end; 
--
没看出来其他方面的基本问题,就看到似乎有计算机内存泄露:
GetArpTable(iarn,tmpat);

GetArpTable中
  ....
  new(par);
  ....
  par.pNext:=aTable;
  aTable  :=par;  //总是指下一个
  ....

当GetArpTable返回的时候,tmpat指向最后一个结构体.....
  //释放的时候,tmpat已经指向最后一个了,表头丢失了.前面的计算机内存全部根本没有办法被释放!!
  CleanParMem(tmpat);

解决计算机内存泄露后再看看.
另外,建议您用TList来实现,delphi已经封装好了,直接或者是间接用吧.---
我也想了解,谢谢LZ.---
等待牛人来答.
[]作者:本站整理  来源:不祥