当第三方API将函数指针定义为回调时,它采用void *,如下所示:
typedef void (__stdcall *CALLBACK)(int type,void * data);
然后回调实现通过函数调用传递到api中,如下所示:
int __stdcall SetCallbackToGetAsyncStuff(CALLBACK func);
然后,当事情发生时,API会调用CALLBACK
的实现。
实现方法是否负责清理void*
指针。
或者是一般假设指针会被调用代码清理掉?
复制void*
的内容是明智的,只要您通过类型enum,
知道大小到您自己的堆栈变量中?
如果除了头文件中的上述信息之外没有文档,应该假设什么。
答案 0 :(得分:3)
关于“谁需要删除指针”的问题的正确答案是“分配它的同一方”。如果库没有使用您的代码编译并驻留在.dll文件中,则它通常使用不同的CRT。您无法使用一个CRT创建对象并使用另一个CRT删除它。
第三方库可能依赖于您的应用分配的内存缓冲区,或者它可以自行分配内存并为您的应用提供访问权限。如果您没有分配与传递给回调的数据相关联的任何内存,则不应删除它。至少在使用精心设计的图书馆时。
很难从你的问题中分辨出谁分配了内存。
答案 1 :(得分:2)
由客户端代码决定如何定义回调。如果回调函数假定所有权,则应该释放。
请注意其他情况,即同一数据指针可以传递给多个回调并导致程序的未定义行为。
或者您可以通过其创建者保留所有权。