是否应删除回调传递的void*指针
Should a void* pointer passed in by a callback be deleted
当第三方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删除它。
第三方库可能依赖于你的应用程序分配的内存缓冲区,也可以自己分配内存,并为你的应用提供访问权限。如果你没有分配任何与传递给回调的数据相关的内存,你不应该删除它。至少在使用设计良好的库时是这样。
很难从你的问题中判断出是谁分配了内存。
如何定义回调取决于客户端代码。若回调函数拥有所有权,那个么它应该是空闲的。
请注意,在其他情况下,相同的数据指针可以传递给多个回调,并导致程序的未定义行为。
或者,您可以将所有权保留给其创建者。
相关文章:
- 如何在 C++ 中将 void 函数传递给 void 指针
- 将通用引用强制转换为可调用的 void 指针,反之亦然
- C++为 void 指针分配一个字符串
- 为什么在将 void 指针转换为整数指针时出现分段错误
- 取消引用 void 指针以将值分配给结构
- C 与 C++,处理 void** 指针
- 除了调用全局删除运算符之外,删除一个void指针还能做什么呢
- 用非零值初始化void指针的正确(或最安全)方法
- 将 void 指针分配给另一个 void 指针
- c ++ 我是否需要手动删除指向另一个具体类型的 void* 指针?
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- 如何将 std::string 赋回作为 <char>void* 指针传递的 std::vector.data()?
- 将指针传递到结构,与传递 void 指针并强制转换为结构
- 如何在void*指针下检查运行时类型(允许简单类型,没有基类)?
- 用于初始化结构的 void 指针强制转换
- 使用 void 指针:void **ptr.. 如何修改共享内存的值?
- 访问由 void 指针引用的结构的成员
- 你不能在 void 指针上使用指针算法,那么 void 指针数组是如何工作的呢?
- 如何警告 C 中 void 指针上的参数不兼容的类型
- 指向类模板方法的 void 指针的向量