无效的指针操作 - Delphi XE

ThN*_*ThN 10 delphi debugging exception delphi-xe

我似乎无法想出这个.我的程序编译并成功运行,但在调试期间,只有在关闭程序时会弹出一个消息框,显示"无效的指针操作".我已经仔细检查了所有FormCloseQuery和FormDestory事件是否存在任何语法或逻辑错误.我发现没有,他们按预期执行没有任何错误.

在此输入图像描述

当我告诉编译器在无效指针操作错误中断时,它没有做任何事情,只是挂起程序.此时,我不得不终止或终止该过程.

你是怎么想出来的?

提前致谢,

Mas*_*ler 29

内存管理器在尝试释放无效内存时抛出无效指针异常.有三种方法可以实现.

最常见的是因为您试图释放已经释放的对象.如果打开FastMM的FullDebugMode,它将检测到这一点并直接指出问题所在.(但请确保构建一个映射文件,以便它具有创建有用堆栈跟踪所需的信息.)

第二种方法是,如果你试图释放分配给内存管理器以外的其他地方的内存.从Delphi EXE 传递一个字符串到没有使用共享内存管理器功能的Delphi DLL时,我已经看过几次了.

而第三种方式涉及直接搞乱指针,可能不适用于你.如果您尝试FreeMemDispose不指向FastMM分配的实际内存块的错误指针,您将收到此错误.

这很可能是第一个.使用FullDebugMode,您将轻松找到问题的根源.


Rob*_*edy 10

当您告诉Delphi内存管理器释放不属于它的内存时,会发生无效的指针操作.有三种方式可能发生:

  • 释放已经释放的指针或对象.
  • 使用FreeMem以释放被一些其他的内存管理器分配(如东西GlobalAllocCoTaskMemAlloc).
  • 释放未初始化的指针.(这与释放空指针不同,这是完全安全的.)

在程序的某个地方,你正在做其中的一件事.调试器已检测到内存管理器抛出的异常,因此请进行一些调试.从堆栈跟踪中,您应该能够看到您尝试释放的变量.检查程序的其余部分以了解使用变量的其他方法.

MadExcept和Eureka Log等工具可以帮助您找到双重免费错误.他们可以跟踪有问题的指针在哪里被分配以及第一次被释放的位置,这有时是足够的信息来找出你的错误并停止多次释放.