0

我刚刚对 freeDiameter 库中的“fd_sess_handler_create”函数有一个疑问。

好吧,在 test_app 扩展中,有一个 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_handler_free 函数体中究竟应该清理什么?

4

1 回答 1

0

释放的sess_handler_free需求struct sess_state 以及您的代码附加到它的任何其他数据结构。

如果你没有任何额外的数据结构,你应该只使用能够sess_handler_free拨打电话free(state)。(直接传递 free 函数是另一种方法。)

如果您确实有其他数据结构,则需要struct sess_statedeletenewfreemalloc

参见diameap_cli_sess_cleanup示例实现 - 请注意,在释放自身之前,它会检查methodDatauser.password字段user.userid并释放它们(如果存在)struct sess_state- 此扩展分配了这些字段,因此它负责释放它们。

于 2017-01-23T10:34:02.910 回答