【发布时间】:2013-12-23 08:22:57
【问题描述】:
当第三方 API 将函数指针定义为带有 void* 的回调时,如下所示:
typedef void (__stdcall *CALLBACK)(int type,void * data);
然后回调实现通过函数调用传递给api,如下所示:
int __stdcall SetCallbackToGetAsyncStuff(CALLBACK func);
然后当事情发生时,API 会调用CALLBACK 的实现。
清理void*指针是不是实现方法的责任。
还是一般假设指针会被调用代码清除?
如果您通过enum, 类型知道大小,将void* 的内容复制到您自己的堆栈变量中是否明智?
如果除了头文件中的上述信息之外没有文档,应该假设什么。
【问题讨论】:
-
在防守端,您应该假设
void * data不会永远存在,并且至少可以将内存用于其他用途。 -
这个“谁拥有它”的问题是 C++ 试图摆脱指针传递并使用移动语义来有效地按值传递的原因。
-
请注意,如果您尝试在 C++ 中的指针上使用
operator delete,如果对象是具有析构函数的类,它将不会调用析构函数。 -
C 和 C++ 是不同的语言。 C 将类型枚举和
void*指针与 malloc/free 一起使用。 C++ 使用继承和新/删除。弄清楚您使用的语言将有助于提出更连贯的问题。 -
以上,加上检查库是否提供任何其他功能,允许您在完成它指向的数据后返回 void*。如果没有明确定义回调返回的数据的所有权/生命周期,则 lib 的文档非常糟糕。
标签: c++ c pointers memory-management