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 ...
随机推荐
- [Python]_ELVE_centos7安装Python3.7.1与Python2共存
注:该博客转载至PengYunjing博客,加以改动. #0x01 安装依赖环境 yum -y install zlib-devel bzip2-devel openssl-devel ncurses ...
- Python实例之抓取HTML中的数据并保存为TXT
本实例实现了抓取捧腹网中存储于html中的笑话数据(非JSON数据) 通过浏览器相关工具发现捧腹网笑话页面的数据存储在HTML页面而非json数据中,因此可以直接使用soup.select()方法来抓 ...
- HBASE 优化之REGIONSERVER
HBASE 优化之REGIONSERVER 一,概述 本人在使用优化regionserver的过程有些心得,借此随笔的机会,向大家介绍我的心得,有些是网上拿来的有些是自己在使用过程自己的经验,希望对大 ...
- 第6章 Hyperledger Fabric模型
This section outlines the key design features woven into Hyperledger Fabric that fulfill its promise ...
- 网络工具之chisel + openvpn混合
目的: 访问内网的shared folder 内网可以无缝访问internet而不需要设置代理(因为有些软件没办法支持代理,比如rustup) 解决方案: 基本思路 家里 设置chisel服务开放44 ...
- oracle报错 ORA-02290: 违反检查约束条件问题
场景: 使用plsql/developer 将原本要求非空的字段 改为可以为空 然后在插入数据的时候 报错改字段约束条件还起作用 解决方案: 首先查询该表的约束条件 select * from u ...
- Rabbit MQ
前言: MQ 是什么?队列是什么,MQ 我们可以理解为消息队列,队列我们可以理解为管道.以管道的方式做消息传递. 场景: 1.其实我们在双11的时候,当我们凌晨大量的秒杀和抢购商品,然后去结算的时候, ...
- MUI在项目中使用时遇到的问题的个人分享
picker 添加年插件问题总结 1. 取消按钮点击事件无法获取 可以获取到取消按钮标签和确定按钮标签 但是只能获取去顶按钮事件,取消点击事件无法获取 通过判断picker的display状态也不能确 ...
- RK3399 友善NanoPC-T4开发板使用sysfs方法控制status LED状态灯-【申嵌视频-RK3399篇】
实验1:sysfs 操作方法控制NanoPC-T4开发板上LED灯 (status LED状态灯:GPIO0_B5/LED1_OUT)root@NanoPC-T4: cd /sys/class/led ...
- css 小坑
1.display:inline-block 内容上下移动 原因:inline-block 默认对齐方式是底部对齐 方法:加一个 vertical-align:top; 属性 把垂直对齐方式改为顶部