Как проверить структуру освобождения - PullRequest
2 голосов
/ 02 апреля 2019

У меня есть непрозрачная структура вместе с функциями выделения / освобождения в заголовочном файле. Вот оно:

my_strct.h * * 1004

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 Ответ

4 голосов
/ 02 апреля 2019

Простой ответ: Вы не можете.free не дает никаких подсказок, работает ли он должным образом или нет, но стандарт C гарантирует, что он освободит память, если вы ее вызовите и указатель существует.Так что вам не нужно проверять это.

Если вы хотите проверить, называется ли бесплатный, вы можете присвоить NULL после свободного и проверить это.

...