检查gobject是否正确释放

桑德罗·维滕

我正在使用glib的测试框架进行单元测试。我的库还使用gobject,在我的测试单位中,我想检查每个对象的最后一个_unref之后是否正确释放了该对象。当g_test_trap_fork可用时,我在每个_unref之后使用它,再次调用_unref,然后检查g_test_trap_assert_failed()。

但是,现在不推荐使用g_test_trap_fork,我正在朝g_test_trap_subprocess迈进。问题是,现在我将不得不为每个要检查的_unref编写一个单独的测试用例,并且由于每个用例都可能包含多个对象,这意味着每个测试用例的重复都会为每个已经存在的每个用例添加第二个_unref。

例如,我试图像这样修复:

NcmVector *v = test->v;
GVariant *var = ncm_vector_get_variant (v);

g_assert (!g_variant_is_floating (var));
g_assert (g_variant_is_container (var));
g_assert_cmpuint (ncm_vector_len (v), ==, g_variant_n_children (var));

{
  NcmVector *nv = ncm_vector_new_variant (var);
  gint i;

  g_assert_cmpuint (ncm_vector_len (v), ==, ncm_vector_len (nv));
  for (i = 0; i < ncm_vector_len (v); i++)
  {
    ncm_assert_cmpdouble (ncm_vector_get (v, i), ==, ncm_vector_get (nv, i));
  }

  ncm_vector_free (nv);
  NCM_TEST_FAIL (ncm_vector_free (nv));
}

g_variant_unref (var);
NCM_TEST_FAIL (g_variant_unref (var); fprintf (stderr, "fail (%s)", g_variant_get_type_string (var)));

宏NCM_TEST_FAIL由以下方式给出:

#define NCM_TEST_FAIL(cmd) \
G_STMT_START { \
  if (g_test_subprocess ()) \
  { \
    cmd; \
    exit (0); \
  } \
  else \
  { \
    g_test_trap_subprocess (NULL, 0, 0); \
    g_test_trap_assert_failed (); \
  } \
} G_STMT_END

该解决方案的问题在于,在每个测试用例中只能使用一次。如上例所示,如果第二次使用,它将仅测试g_test_subprocess()的首次出现。

我考虑过在最后一个_unref之前检查gobject结构内部的引用计数,以检查它是否==1。但这将涉及访问该结构的私有部分,如果可能的话,我会避免该部分。

关于如何在同一测试用例中多次检查错误代码的任何想法?

bas

如果您需要检查a的GObject配置是否正确,则可以使用g_object_add_weak_pointer(),例如:

FooObject *o = g_object_new (foo_object_get_type (), NULL);

g_assert_nonnull (o);

// the contents of the pointer are reset to NULL when the last reference to
// the GObject instance goes away; by passing a pointer to the same instance
// we can check it for NULL later
g_object_add_weak_pointer (G_OBJECT (o), (gpointer *) &o);

// ...test FooObject...

// drop the last reference
g_object_unref (o);

// at this point, the object should be NULL if nothing is holding
// an additional reference.
g_assert_null (o);

不过,在上面的示例中,您使用的GVariant不是GObject,因此它没有弱引用。

由于二进制兼容性的原因,GLib没有通用的引用计数类型。引用计数类型的所有通用代码都在中GObject

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

检查gobject是否正确释放

来自分类Dev

如何检查指针是否已释放

来自分类Dev

检查是否释放了HTML按钮

来自分类Dev

这段代码中delete []是否正确释放?

来自分类Dev

检查semver是否正确

来自分类Dev

检查拼写是否正确

来自分类Dev

如何检查解密是否正确?

来自分类Dev

如何使用键状态SDL检查是否已释放键

来自分类Dev

检查按下C#XNA后是否释放键

来自分类Dev

如何检查分配的内存是否已释放?

来自分类Dev

libXML:检查节点是否已经取消链接并释放

来自分类Dev

我是否以正确的方式释放了此链表?

来自分类Dev

检查多个条件是否不正确

来自分类Dev

如何检查Xerces格式是否正确

来自分类Dev

python请求检查文件是否正确下载

来自分类Dev

检查mysqli查询是否成功的正确方法

来自分类Dev

如何使用Perl检查参数是否正确?

来自分类Dev

检查json响应是否正确

来自分类Dev

如何检查测验答案是否正确?

来自分类Dev

UITextChecker:检查Word是否已经正确的方法?

来自分类Dev

根据卡号检查PIN码是否正确

来自分类Dev

如何检查子进程是否正确终止?

来自分类Dev

在Laravel中检查密码是否正确

来自分类Dev

使用codeigniter检查密码是否正确

来自分类Dev

如何检查QProcess是否正确执行?

来自分类Dev

使用python请求检查登录是否正确

来自分类Dev

检查日期是否以表格形式正确输入

来自分类Dev

如何检查我的内存分配是否正确?

来自分类Dev

检查是否递归调用方法的正确方法