c++ - 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 是 PF_Handle,它是通过调用host_new_handle
. 这意味着插件需要一个双指针。没有调用锁定函数并且插件尝试访问双指针数据,当然失败了。
可能是什么问题?
这里会发生什么?锁定和解锁双指针是什么意思?
解决方案
句柄指向可移动存储器。内存可能会被内存管理器移动,从而使您拥有的指针无效。为了创建句柄,请使用内存管理器提供的 API——否则管理器将不知道如何移动分配的内存。锁定手柄可防止内存被使用,并为您提供一个指针,您可以在手柄锁定时使用。您不应该将句柄锁定的时间超过访问内存所必需的时间,否则您会违背内存管理器的目的,导致资源耗尽和其他问题。在编译器不对其进行优化的情况下,可以通过双重取消引用访问未锁定的句柄。而且它比锁定慢,除非你只做一件简单的事情。
推荐阅读
- c# - Unity IOC 使用 InjectionConstructor 简化类型注册
- java - LIBGDX 问题,我没有 box2d “Body” 类
- mysql - 我需要下载 MySQL 由于数量而无法处理的数据
- python - Matplotlib:如何将绘图保存在 pdf 文件中
- angular - 使用 Angular 从 google 和 facebook 注销
- android - 领域数据库对移动应用程序有存储限制吗?
- r - 从数据框中删除属性
- javascript - 隐藏特定时间的字段
- android - Android Hello World 项目错误:“守护进程:AAPT2 aapt2-3.2.0-4818971-windows Daemon #2”
- sql - 在亚马逊红移中从 now() 中提取时间