【发布时间】:2015-08-09 12:35:36
【问题描述】:
我有以下回调:
struct my_struct{
void*(my_alloc)(size_t);
void (my_free)(void*);
};
void *alloc_fn(png_structp png, png_size_t size){
my_struct *ptr = static_cast<my_struct*>(/* what here? */);
return ptr->my_alloc(size);
}
void free_fn(png_structp png, void *mem){
my_struct *ptr = static_cast<my_struct*>(/* again, madness! */);
ptr->my_free(mem);
}
我会这样使用:
int main(){
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
my_struct mem_fn{std::malloc, std::free};
png_set_mem_fn(png_ptr, &mem_fun, alloc_fn, free_fn);
// use png_ptr to load png
}
png_set_mem_fn 有以下原型:
void png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn);
但我不知道如何在alloc_fn 或free_fn 中检索mem_ptr。
我已经阅读了png_get_progressive_ptr 和png_get_user_chunk_ptr,这是我在任何看起来合适的文档中看到的唯一函数。但是png_get_progressive_ptr 返回回调并且png_get_user_chunk_ptr 与文件 中的用户数据相关。
我到底错过了什么?我应该如何检索mem_fun?
【问题讨论】:
-
“为什么在 C++ 中需要函数指针?”这是一个大胆的声明。
my_struct仅用于此问题中的示例,但我的 实际 代码在语义上是等效的。 -
png_get_mem_ptr看起来很相关。 -
@JoachimPileborg 不,我的意思是
mem_ptr,就像png_set_mem_fn的函数原型一样。 -
@AlanStokes 这应该是一个答案,我不知道我是怎么在文档中错过的!