关于Delphi中指针使用的心得

     前段时间一直在搞一个项目,常用到ListView,而且常把Record放入ItemData。一开始我就把对ListView的常规操作都写入一个Dll(包括批量的添加数据,保存数据,加载数据),方便于以后的使用。这是恶梦的开始。

     这样做不要紧,等项目越做越深入时,越来越多的问题突现。只要对ListView操作不管什么操作,添加、删除,就是点击某行,就会跳出“Invalid pointer operation”,或者“Access violation ”某个地址错误。这使得我的项目进程大大受限,最后不得不停下来专心解决这个问题。

     一开始,我并不认为是调用DLL时的问题,当我把其它一些功能层层剥离时发现,就连LoadLibrary('8888.dll');都会出错。最后不得不把注意力放在操作ListView的DLL中。

    这个DLL中有这样一段代码
 1 None.gif function SetSubColumns( var Xml: IXMLDocument;
 2 None.gif                        AddNodeName: WideString;
 3 None.gif                        var ColumnsField : TStringList;
 4 None.gif                        var Lv: TListView ):Boolean;stdcall;
 5 None.gifvar
 6 None.gif    ListItem : TListItem;
 7 None.gif    DataNode: IXMLNode;
 8 None.gif    NodeList: IXMLNodeList;
 9 None.gif    HideStr : PItemData;
10 None.gif    i,j: Integer;
11 None.gifbegin
12 None.gif     try
13 None.gif        NodeList : =  Xml.DocumentElement.ChildNodes;
14 None.gif         for  i : =   0  to NodeList.Count  -   1   do
15 None.gif        begin
16 None.gif            ListItem : =  Lv.Items.Add;
17 None.gif            DataNode : =  NodeList[i];
18 ExpandedBlockStart.gifContractedBlock.gif             dot.gif {用指针HideStr来保存隐藏的ID}
19 None.gif            New(HideStr);
20 None.gif            HideStr.PrimaryKey : =  StrToInt(DataNode.ChildNodes[ColumnsField[ 0 ]].NodeValue);
21 None.gif            ListItem.Data : =  HideStr;
22 None.gif
23 None.gif            ListItem.Caption : =  DataNode.ChildNodes[ColumnsField[ 1 ]].NodeValue;
24 None.gif
25 None.gif             for  j : =   2  to ColumnsField.Count  -   1   do
26 None.gif                ListItem.SubItems.Add(DataNode.ChildNodes[ColumnsField[j]].NodeValue);
27 None.gif
28 None.gif        end;
29 None.gif        Result: =  True;
30 None.gif    except
31 None.gif        Result: =  False;
32 None.gif    end;
33 None.gifend;

     其中有一段代码为 New(HideStr);为ItemData分配内存,这才是问题的所在。语法本身是没有任何问题,但是放错了地方,因为我调用这个DLL时是动态调用,执行完后直接FreeLibrary了,当FreeLibrary时,同时也释放了ItemData所对应的内存地址。所以第一次操作ListView时没有任何问题,第二次操作时就错误百出。

     解决的方法有只有一个,就是把分配内存的操作放入主线程,不要放入DLL中。

     总结,对于分配内存的操作还是由主程序(主线程)来分配,这样操作起来方便而且不会出错,当主程序关闭时,会一起把分配的内存释放掉。真是吃一堑长一智啊。 

转载于:https://www.cnblogs.com/sonicit/archive/2007/05/20/752965.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值