在用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的更多相关文章

  1. 启动startUML的时候报错“"Exception EOleSysError in module StarUML.exe at 000AD559. "

    win7操作系统在安装startuml的时候总是报错 出现了如下错误提示:"Exception EOleSysError in module StarUML.exe at 000AD559. ...

  2. Delphi:Exception输出堆栈信息

    起源: 用习惯了c#之Exception的StackTrace,在程序出异常crash时候能够以其定位出问题的模块及行号,用回Delphi 2009,发现没有这东西. 显然,在编译环境日新月异的今天, ...

  3. 运行WampServer时,提示Exception Exception in module wampmanager.exe at 000F15A0.解决办法

    出现问题:运行WampServer时,提示Exception Exception in module wampmanager.exe at 000F15A0.解决办法 出现问题原因: ①:缺少Visu ...

  4. 安装wamp后 异常Exception Exception in module wampmanager.exe at 000F15A0

    系统环境:Windows 2008 R2 64bit 安装环境:wampserver2.4-x64 按照正常windows安装程序,完成WAMP Server程序安装,安装完成启动WAMP Serve ...

  5. 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 ***(如 ...

  6. Solve Error: Unhandled exception at 0x00905a4d in xxx.exe: 0xC0000005: Access violation.

    在使用Visual Studio进行项目开发的时候,有时候会遇到下面这个错误: Unhandled exception at 0x00905a4d in xxx.exe: 0xC0000005: Ac ...

  7. Delphi之Exception获得错误信息(简单好理解)

    Delphi之Exception获得错误信息 相关资料: http://www.cnblogs.com/hackpig/archive/2010/02/15/1668547.html 实例代码: 1 ...

  8. 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 ……最近遇到了个问题,上午 ...

  9. 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 ...

随机推荐

  1. 1、链表之增、删、查实现(C语言)

    一.功能描述: 可以创建节点并添加到链表中.查看链表中的所有节点.并可以删除特定的节点 二.代码实现 1.主函数main主要实现的是从后台键入不同的字符,执行对应的函数来实现特定的操作代码如下: in ...

  2. 工控随笔_03_西门子_Step7项目打开后CPU显示问号解决方法

    我们在利用西门子的S7-300/400 PLC的编程软件Step7的时候会出现下面如图所示的问题. 在打开项目的时候,我们会在Simatic Manager里面看到CPU以及一些其他一些组件显示问号. ...

  3. 【CentOS】PostgreSQL安装与设定

    本教程适合Centos6.7或者RedHat. PostgreSQL安装 1.Postgresql安装包确认 yum list postgresql* postgresql-server.x86_64 ...

  4. 【linux】常用命令之用户管理

    查看用户 cat /etc/passwd 查看某一个用户 cat /etc/passwd|grep javaluna 新增用户 useradd xxx 更新密码 passwd xxx 删除用户及相关配 ...

  5. vue插件大全汇总

    Vue是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件特别整理了常用的vue插件,来了个大汇总,方便查找使用,便于工作 ...

  6. PAT 乙级 1044 火星数字 (20 分)

    1044 火星数字 (20 分) 火星人是以 13 进制计数的: 地球人的 0 被火星人称为 tret. 地球人数字 1 到 12 的火星文分别为:jan, feb, mar, apr, may, j ...

  7. Scrapy实战篇(八)之爬取教育部高校名单抓取和分析

    本节我们以网址https://daxue.eol.cn/mingdan.shtml为初始链接,爬取教育部公布的正规高校名单. 思路: 1.首先以上面的地址开始链接,抓取到下面省份对应的链接. 2.在解 ...

  8. 按固定元素数目分割数组- perl,python

    要求:把40个元素的数组,按每行8个,分5行打印出来.如下图 1 2 3 4 5 6 7 89 10 11 12 13 14 15 1617 18 19 20 21 22 23 2425 26 27 ...

  9. node-js:文摘

    ES6相关 1.module.exports与exports,export与export default之间的关系和区别 nodejs基础 1.NodeJs安装与全局配置(不建议修改包的全局安装路径, ...

  10. Centos 7 虚拟机挂载U盘

    本文记录环境为在Windows 7环境下,通过VMware安装Centos 7.2.挂载U盘过程如下,供日后查看,也供各位读者遇到类似问题时参考. 挂载过程及问题排除如下: 1.因为是虚拟机,所以先到 ...