我正在尝试在我的视频编辑器中托管After Effects插件。
在实现一些Adobe回调时,有一个分配内存的套件(一组函数指针),类型为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是一个普通的空*,那就没什么奇怪的了,我只需调用new/delete
并强制转换指针即可。事实上,我正在调试的同一个插件的代码接受这个指针,锁定它,并直接使用它。但后来在同一个插件中,我看到了这样的代码:
`return *(PF_Pixel**)m_bufH;`
m_bufH是通过调用host_new_handle
分配的PF_Handle。这意味着插件需要一个双指针。没有调用锁定函数,插件尝试访问双指针数据,当然会失败。
可能的问题是什么?
这里会发生什么呢?锁定和解锁双指针有什么意义?
发布于 2020-09-12 17:38:05
句柄指向可移动存储器。内存可能会被内存管理器移动,从而使你拥有的指针失效。要创建句柄,请使用内存管理器提供的API -否则管理器将不知道如何移动已分配的内存。锁定句柄可防止内存被使用,并为您提供一个可在句柄锁定时使用的指针。保持句柄锁定的时间不应超过访问内存所需的时间,否则将违背内存管理器的用途,从而导致资源耗尽和其他问题。在编译器未对其进行优化的情况下,可以通过双重取消引用来访问未锁定的句柄。而且它比锁慢,除非你只做一件简单的事情。
https://stackoverflow.com/questions/63858383
复制相似问题