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

时间:2013-12-06 04:48:01

标签: c++ c pointers memory-management

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

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

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

int __stdcall SetCallbackToGetAsyncStuff(CALLBACK func);

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

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

2 个答案:

答案 0 :(得分:3)

关于“谁需要删除指针”的问题的正确答案是“分配它的同一方”。如果库没有使用您的代码编译并驻留在.dll文件中,则它通常使用不同的CRT。您无法使用一个CRT创建对象并使用另一个CRT删除它。

第三方库可能依赖于您的应用分配的内存缓冲区,或者它可以自行分配内存并为您的应用提供访问权限。如果您没有分配与传递给回调的数据相关联的任何内存,则不应删除它。至少在使用精心设计的图书馆时。

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

答案 1 :(得分:2)

由客户端代码决定如何定义回调。如果回调函数假定所有权,则应该释放。

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

或者您可以通过其创建者保留所有权。