Access violation问题

这礼拜在工作中遇到了非法访问内存问题,也就是 Access violation问题,出现了类似下面这种报错:

Access violation at address ××× in module  'xxx.exe'   Read of address 000000

Access violation分两类:运行期和设计期。
我这边遇到的是运行期Access violation问题!

常常在计算机用户运行的程序试图存取未被指定使用的存储区时遇到
解决方法:任何一个new都需要判断结果是不是没有分配到内存,并且记录下LastError,以及位置。

接下来是我解决的思路:
我猜测是内存溢出问题,可能代码中没有将使用过的窗体释放所以才造成了这类问题,关于内存问题,这边要提一下:内存泄露和内存溢出。
还有在delphi调试过程中快捷键:
ctrl+alt+m,可以查看每个函数过程的内存位置。
Ctrl+Alt+C 查看代码对应的汇编

内存溢出是指:程序再申请内存时,没有足够的内存空间供其使用。比如往int存入long
内存泄露是指:无法将已申请的内存释放。一次内存泄露不可怕,但是内存泄漏堆积的话无论多少内存都会被占满,造成内存溢出问题。(内存泄露产生的情况应该是,你的某个指针指向这块内存,但你用完了没有free,然后你自己找不到这块内存,而系统也不能将这块内存回收,所以内存泄露了,在java种类似这样的一块内存会被gc识别为不可达内存而清理掉)
内存泄露可以分为4类:
1.常发性内存泄露,即发生内存泄露的代码不止执行一次
2.偶发性内存泄露,即在特定环境下发生内存泄露。
3.一次性内存泄露,发生内存泄露的代码只执行一次,比如构造函数分配了内存,但析构函数没有释放
4.隐式内存泄露,程序运行过程中不断分配内存但直到结束才释放内存,比如程序运行时间过长,耗尽了系统内存。虽然这种情况最后都释放了内存,但这其中的过程中出现了内存泄露的那种内存情况,所以我们称之为隐式内存泄露。
好的我们继续
我试着在窗体创建上面加入如下代码:

if Assigned(XXXForm) then   XXXForm:= nil;
//上面这行是我加进去的
XXXForm:= TXXXForm.Create(nil);
XXXForm.vProDepID:=PSubject(vSelectTreeNode.Data)^.iSubID;
XXXForm.vState := 0 ;
XXXForm.ShowModal;
final
FreeAndNil(XXXForm);

然后Access violation 报错就不会再跳出来了。

在Delphi中一个对象名只是一个指向该对象的指针,可以有多个指针指向同一个对象地址。Nil是将指针置空,而Free则将指针指向的对象销毁掉。

还有在销毁对象时一定要注意,看还有没有其他指针指向该对象,如果有却销毁掉了,那么其他指针调用该对象时会报错。

这个报错是在我退出系统之后才弹出来警告,那是不是意味着,退出系统的时候要执行Free将XXXForm的内存销毁,但是在此,有其他对象要访问XXXForm所以报错了。

参考:http://www.voidcn.com/article/p-fsbyxmkv-beo.html

还有在这边记一下:学习过的内容要经常复习。所以要多看看自己的博客!!!

你可能感兴趣的:(学习)