是否应删除回调传递的void*指针

Should a void* pointer passed in by a callback be deleted

本文关键字:void 指针 删除 回调 是否      更新时间:2023-10-16

当第三方API将函数指针定义为接受void*的回调时,如下所示:

typedef void (__stdcall *CALLBACK)(int type,void * data);

然后通过如下函数调用将回调实现传递到api中:

int __stdcall SetCallbackToGetAsyncStuff(CALLBACK func);

然后,当事情发生时,API将调用CALLBACK的实现。

是否由实现方法负责清理void*指针。或者这是一个普遍的假设,指针将被调用的代码清理掉?如果您通过类型enum,知道大小,那么将void*的内容复制到您自己的堆栈变量中是明智的吗?如果头文件中除了上述信息之外没有其他文档,应该怎么想。

"谁需要删除指针"这个问题的正确答案是"分配指针的同一方"。如果一个库不是用你的代码编译的,而是驻留在.dll文件中,那么它通常会使用不同的CRT。不能用一个CRT创建对象,然后用另一个CRT删除它。

第三方库可能依赖于你的应用程序分配的内存缓冲区,也可以自己分配内存,并为你的应用提供访问权限。如果你没有分配任何与传递给回调的数据相关的内存,你不应该删除它。至少在使用设计良好的库时是这样。

很难从你的问题中判断出是谁分配了内存。

如何定义回调取决于客户端代码。若回调函数拥有所有权,那个么它应该是空闲的。

请注意,在其他情况下,相同的数据指针可以传递给多个回调,并导致程序的未定义行为。

或者,您可以将所有权保留给其创建者。