Adobe After Effects SDK中的怪异PF_Handle声明

问题描述

我正在尝试在视频编辑器中托管After Effects插件

在实现某些Adobe Callback时,有一套PF_Handle类型的分配内存的套件(一组函数指针)。这种类型的声明很奇怪 typedef void **PF_Handle;

双指针。 here说明了我要求实现的功能指针。

PF_Handle (*host_new_handle)(A_HandleSize size);
void (*host_lock_handle)(PF_Handle pf_handle);
void (*host_unlock_handle)(PF_Handle pf_handle);
void (*host_dispose_handle)(PF_Handle pf_handle);

如果PF_Handle是一个普通的void *,那就没什么奇怪的了,我只需要调用new/delete并强制转换指针即可。确实,我正在调试的同一插件代码将使用该指针,将其锁定并直接使用。但是稍后在同一个插件中,我看到这样的代码

`return *(PF_Pixel**)m_bufH;`

m_bufH是PF_Handle,它是通过调用host_new_handle分配的。这意味着该插件需要一个双指针。没有调用锁定函数插件尝试访问双指针数据,当然失败了。

可能是什么问题?

这里会发生什么?锁定和解锁双指针是什么意思?

解决方法

句柄指向可移动内存。内存可能会被内存管理器移动,从而使您的指针无效。为了创建一个句柄,请使用内存管理器提供的API-否则管理器将不知道如何移动分配的内存。锁定手柄可防止内存被使用,并为您提供了在锁定手柄时可以使用的指针。您不应将句柄的锁定时间超过访问内存的严格必要时间,否则会违背内存管理器的用途,从而导致资源耗尽和其他问题。在编译器未对其进行优化的情况下,可以通过双重取消引用访问解锁的句柄。而且它比锁定要慢,除非您只做一件简单的事情。