delphi:Exception EInvalidPointer in module Project1.exe
在用delphi XE5编程时遇到如下问题:
Exception EInvalidPointer in module Project1.exe at 00007595.
Invalid pointer operation.

从描述上来看,是指针使用错误引起的。我并没用使用太多指针变量,我首先检查了一下动态数组(事实上动态数组在SetLength后,即使越界了,也不会报错),发现没有问题。于是我是用Debug调试。出现如下窗口:

点击 Break,跳到了这里:
procedure TObject.FreeInstance;
begin
CleanupInstance;
_FreeMem(Pointer(Self));
end;
箭头指向第四行。
图片如下:

看到FreeMem,我想到自己创建过一个TFont类的一个对象。
代码如下:
Ofont:=TFont.Create();
OFont:=Canvas.Font;
Canvas.Font.Name:='微软雅黑';
Canvas.Font.Style:=[fsBold];
Canvas.Font.Color:=clBlack;
Canvas.Font.Height:=;
tempint:=(Form1.ClientWidth-Canvas.TextWidth('XXXXXXXX') ) div ;
Canvas.TextOut(tempint,,'XXXXXXXX');
Canvas.Font:=OFont;
OFont.Free;
然后我将第10行的语句注释掉后,异常就消失了。果然问题出在这。
但是新的问题又来了,一个对象创建了难道不应该Free吗?在百度上查了一番后,才知道:
使用这种方式创建对象,
Ofont:=TFont.Create();
可以不Free,函数执行完后,会自行Free。不过最好Free。而且最好使用try语句。但是我这里为什么不能Free呢?
其实是一个关于对象复制的知识我没有搞懂。对象名,就是一个指针。使用:
OFont:=Canvas.Font;
其实是将Canvas.Font的指针赋值给了OFont,
OFont.Free;
这个语句实际上也在释放Canvas.Font。Canvas.Font是由系统管理的,这里不应该释放,否者就出现已释放的指针再进行释放。
我这段代码也没有起到“保护现场”的作用。应该使用:
Ofont.Assign(Canvas.Font); //将原始值保留
来复制对象的值来达到保护现场的作用。代码修改后如下:
procedure TForm1.InitFormUI();
{*功能:在窗体上方居中显示 “XXXXXXXX”}
var
tempint:integer;
Ofont:TFont;
begin
{* Ofont不添加 free语句,程序异常消失 -
*异常为:(delphi Exception EAccessVioation in module Project1)}
Ofont:=TFont.Create();
Ofont.Assign(Canvas.Font); //将原始值保留
Canvas.Font.Name:='微软雅黑';
Canvas.Font.Style:=[fsBold];
Canvas.Font.Color:=clBlack;
Canvas.Font.Height:=;
tempint:=(Form1.ClientWidth-Canvas.TextWidth('XXXXXXXX') ) div ;
Canvas.TextOut(tempint,,'XXXXXXXX');
Canvas.Font.Assign(OFont); //恢复为原始值
OFont.Free;
end;
delphi:Exception EInvalidPointer in module Project1.exe的更多相关文章
- 启动startUML的时候报错“"Exception EOleSysError in module StarUML.exe at 000AD559. "
win7操作系统在安装startuml的时候总是报错 出现了如下错误提示:"Exception EOleSysError in module StarUML.exe at 000AD559. ...
- Delphi:Exception输出堆栈信息
起源: 用习惯了c#之Exception的StackTrace,在程序出异常crash时候能够以其定位出问题的模块及行号,用回Delphi 2009,发现没有这东西. 显然,在编译环境日新月异的今天, ...
- 运行WampServer时,提示Exception Exception in module wampmanager.exe at 000F15A0.解决办法
出现问题:运行WampServer时,提示Exception Exception in module wampmanager.exe at 000F15A0.解决办法 出现问题原因: ①:缺少Visu ...
- 安装wamp后 异常Exception Exception in module wampmanager.exe at 000F15A0
系统环境:Windows 2008 R2 64bit 安装环境:wampserver2.4-x64 按照正常windows安装程序,完成WAMP Server程序安装,安装完成启动WAMP Serve ...
- Navicat 提示 Access violation at address ***(如004ECCF4) in module ‘navicat.exe’. Read of address ***(如00000048)
Navicat 提示 Access violation at address ***(如004ECCF4) in module ‘navicat.exe’. Read of address ***(如 ...
- Solve Error: Unhandled exception at 0x00905a4d in xxx.exe: 0xC0000005: Access violation.
在使用Visual Studio进行项目开发的时候,有时候会遇到下面这个错误: Unhandled exception at 0x00905a4d in xxx.exe: 0xC0000005: Ac ...
- Delphi之Exception获得错误信息(简单好理解)
Delphi之Exception获得错误信息 相关资料: http://www.cnblogs.com/hackpig/archive/2010/02/15/1668547.html 实例代码: 1 ...
- C-Lodop提示Access violation at address ...in module 'CLodopPrint32.exe' write of address
C-Lodop提示 Access violation at address ……in module 'CLodopPrint32.exe' write of address ……最近遇到了个问题,上午 ...
- PL/SQL插入数据报错:Access violation at address 00413A81 in module 'plsqldev.exe'. Read of address 00000000
前言 今天同事在使用plsql给oracl数据库插入记录时报错:Access violation at address 00413A81 in module 'plsqldev.exe'. Read ...
随机推荐
- HTML中引入CSS的四种常用方法及各自的缺点
在HTML中引入CSS的方法主要有四种,它们分别是行内式.内嵌式.链接式和导入式. 1.行内式 行内式是在标记的style属性中设定CSS样式.这种方式没有体现出CSS的优势,不推荐使用.格式如下: ...
- ZZFAFA_BilibiliMusic_DownUrl
OneDrive_DownFileUrl: FHProductionHK-BGM:https://1drv.ms/f/s!Ajs97XY1QSQ8cPXo36h4AK9XG7k CABAL&A ...
- 解决解决httpd: Could not reliably determine the server's fully qualified domain name
vi /etc/httpd/conf/httpd.conf 加入一句 ServerName localhost:80 参考:https://www.cnblogs.com/52linux/ar ...
- oracle11g 数据库修改 UTF8字符集
步骤一:执行以下命令 sqlplus "/as sysdba" conn /as sysdba; shutdown immediate; startup mount; ALTER ...
- VSFTP的使用
一.基本安装 1.安装服务 yum -y install vsftpd //centos Redhat apt-get install vsftpd //debian ubuntu 2.开启服务 se ...
- GitLab配置后收取不到邮件问题
一.root权限下,修改gitlab的配置文件:/etc/gitlab/gitlab.rb gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_ ...
- mysql常规巡检
mysql常规巡检 目录 一.巡检脚本 二.下载巡检脚本 三.脚本执行说明 1.inspection.conf 使用说明 2.inspection_mysql.sh 使用说明 3.mysqltun ...
- win10更新后出现System.ComponentModel.Win32Exception
win10更新后出现System.ComponentModel.Win32Exception 我的环境是由于“sql server2012 无法连接到WMI提供程序”引起的 参考http://www. ...
- Shiro与基本web环境整合登陆验证实例
1. 用maven导入Shiro依赖包 <dependency> <groupId>org.apache.shiro</groupId> <artifactI ...
- C#动态给Word文档填充内容
//filePath:word文档的路径:strOld:需要替换的内容:strNew:替换的新内容: //注意:strOld中的字符数量要与新的strNew中的一一对应 public static v ...