自由直径-fd_sess_handler_create

自由直径-fd_sess_handler_create,c,free-diameter,C,Free Diameter,我只是对freeDiameter库中的“fd_sess_handler_create”函数有一个问题 好的,在test_app extension中,有一个ta_cli_init函数来初始化客户端过程,当代码在C中时,这个块被编译得很好: int ta_cli_init(void) { CHECK_FCT( fd_sess_handler_create(&ta_cli_reg, (void*)free, NULL, NULL) ); CHECK_FCT( fd_event_tri

我只是对freeDiameter库中的“fd_sess_handler_create”函数有一个问题

好的,在test_app extension中,有一个ta_cli_init函数来初始化客户端过程,当代码在C中时,这个块被编译得很好:

int ta_cli_init(void)
{
  CHECK_FCT( fd_sess_handler_create(&ta_cli_reg, (void*)free, NULL, NULL) );
  CHECK_FCT( fd_event_trig_regcb(ta_conf->signal, "test_app.cli", ta_cli_test_message ) );
  return 0;
}

但是,一旦我把代码改成C++,编译器就开始唠叨“清除”参数(第二个参数),我必须改变代码,使它编译:

void sess_handler_free(struct sess_state * state, os0_t sid, void * opaque)
{
}

int ta_cli_init(void)
{
  CHECK_FCT( fd_sess_handler_create(&ta_cli_reg, &sess_handler_free, NULL, NULL) );
  CHECK_FCT( fd_event_trig_regcb(ta_conf->signal, "ocs_app.cli", ta_cli_test_message ) );

  return 0;
}
代码现在是可以编译的,但因为我不确定清理上下文,正如您所看到的,我将其保留为空


你能解释一下在我的自定义sess\u handler\u free函数体中到底应该清理什么吗?

sess\u handler\u free需要释放
结构sess\u state
以及你的代码附加到它的任何附加数据结构

如果没有任何额外的数据结构,您应该只使用能够使
sess\u handler\u空闲
call
free(state)
。(直接传递free函数是另一种方法。)

如果您确实有其他数据结构,则需要从
struct sess_state
中查找它们,如果它们是使用
new
创建的,则使用
delete
将其释放;如果它们是使用
malloc
创建的,则使用
free

请参见一个示例实现-注意,它检查
methodData
user.password
user.userid
字段,并在释放
struct sess_state
本身之前释放这些字段,此扩展分配了这些字段,因此它负责释放这些字段