如何测试结构解除分配

时间:2019-04-02 08:23:42

标签: c unit-testing free

我在头文件中有一个不透明的结构以及分配/取消分配功能。就是这样:

my_strct.h

typedef struct helper helper;
helper *allocate_helper(void);
void release_helper(helper *helper_ptr);

typedef struct my_struct;
my_struct *allocate_mystruct(void);
void release_mystruct(my_struct *ptr);

my_strct.c

#include "my_strct.h"

struct helper{
    const char *helper_info;
}

helper *allocate_helper(void){
     return malloc(sizeof(struct helper));
}

void release_helper(helper *helper_ptr){
     if(helper_ptr){
         free(helper_ptr -> helper_info);
         free(helper_ptr);
     }
}

struct my_struct{
     const char *info;
     const char *name;
     struct helper *helper_ptr
}

my_struct *allocate_mystruct(void){
    struct my_struct *mystruct_ptr = malloc(sizeof(mystruct_ptr));
    mystruct_ptr -> helper_ptr = allocate_helper(); 
}

void release_mystruct(struct my_struct *mystruct_ptr){
    if(mystruct_ptr){
        release_helper(mystruct_ptr -> helper_ptr);
        free(mystruct_ptr -> info);
        free(mystruct_ptr -> name);
        free(mystruct_ptr);
    }
}

当我尝试为release_mystruct释放函数编写单元测试以确保它不会引起内存泄漏时,出现了问题。我们不能像我们在free中那样简单地拦截对Java的所有调用,而从我那里来的也是从标准库中重新定义函数是未定义的行为。

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:4)

简单答案:您不能。 free不会提示它是否按预期工作,但是C标准保证如果您调用它并且指针存在,它将释放内存。因此,您无需进行检查。

如果要检查是否调用了free,可以在free之后分配NULL并进行检查。