Mas*_*ler 29
内存管理器在尝试释放无效内存时抛出无效指针异常.有三种方法可以实现.
最常见的是因为您试图释放已经释放的对象.如果打开FastMM的FullDebugMode,它将检测到这一点并直接指出问题所在.(但请确保构建一个映射文件,以便它具有创建有用堆栈跟踪所需的信息.)
第二种方法是,如果你试图释放分配给内存管理器以外的其他地方的内存.从Delphi EXE 传递一个字符串到没有使用共享内存管理器功能的Delphi DLL时,我已经看过几次了.
而第三种方式涉及直接搞乱指针,可能不适用于你.如果您尝试FreeMem或Dispose不指向FastMM分配的实际内存块的错误指针,您将收到此错误.
这很可能是第一个.使用FullDebugMode,您将轻松找到问题的根源.
Rob*_*edy 10
当您告诉Delphi内存管理器释放不属于它的内存时,会发生无效的指针操作.有三种方式可能发生:
FreeMem以释放被一些其他的内存管理器分配(如东西GlobalAlloc或CoTaskMemAlloc).在程序的某个地方,你正在做其中的一件事.调试器已检测到内存管理器抛出的异常,因此请进行一些调试.从堆栈跟踪中,您应该能够看到您尝试释放的变量.检查程序的其余部分以了解使用变量的其他方法.
MadExcept和Eureka Log等工具可以帮助您找到双重免费错误.他们可以跟踪有问题的指针在哪里被分配以及第一次被释放的位置,这有时是足够的信息来找出你的错误并停止多次释放.