如何解决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-否则管理器将不知道如何移动分配的内存。锁定手柄可防止内存被使用,并为您提供了在锁定手柄时可以使用的指针。您不应将句柄的锁定时间超过访问内存的严格必要时间,否则会违背内存管理器的用途,从而导致资源耗尽和其他问题。在编译器未对其进行优化的情况下,可以通过双重取消引用访问解锁的句柄。而且它比锁定要慢,除非您只做一件简单的事情。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。