Adobe After Effects SDK中奇怪的PF_Handle声明



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

在实现一些Adobe回调时,有一个类型为PF_Handle的用于分配内存的套件(一组函数指针(。这种类型有一个奇怪的声明typedef void **PF_Handle;

双指针。这里描述了我被要求实现的函数指针。

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是由对CCD_ 4的调用所分配的PF_Handle。这意味着插件需要一个双指针。没有调用任何锁定函数,插件尝试访问双指针数据,当然失败了。

可能是什么问题?

这里会发生什么?锁定和解锁双指针的含义是什么?

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

最新更新