问题描述
我正在尝试在视频编辑器中托管After Effects插件。
在实现某些Adobe Callback时,有一套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是PF_Handle,它是通过调用host_new_handle
分配的。这意味着该插件需要一个双指针。没有调用锁定函数,插件尝试访问双指针数据,当然失败了。
可能是什么问题?
这里会发生什么?锁定和解锁双指针是什么意思?
解决方法
句柄指向可移动内存。内存可能会被内存管理器移动,从而使您的指针无效。为了创建一个句柄,请使用内存管理器提供的API-否则管理器将不知道如何移动分配的内存。锁定手柄可防止内存被使用,并为您提供了在锁定手柄时可以使用的指针。您不应将句柄的锁定时间超过访问内存的严格必要时间,否则会违背内存管理器的用途,从而导致资源耗尽和其他问题。在编译器未对其进行优化的情况下,可以通过双重取消引用访问解锁的句柄。而且它比锁定要慢,除非您只做一件简单的事情。