为什么valglink报告内存泄漏,

问题描述 投票:0回答:1

这是我的 example6_3.h 文件


#ifndef EXAMPLE6_3_H
#define EXAMPLE6_3_H



typedef struct __list_t list_t;

// Allocation function
list_t* list_malloc();
// Constructor and destructor functions
void list_init(list_t*);
void list_free(list_t*);
// Public behavior functions
int list_add(list_t*, const int);
int list_get(list_t*, const int, int*);
void list_clear(list_t*);
size_t list_size(list_t*);
void list_print(list_t*);

#endif

这是我的 example6_3.c 文件


#include "example6_3.h"
#define MAX_SIZE 10
typedef int bool_t;
typedef struct __list_t {
    size_t size;
    int* items;
}list_t;

bool_t __list_is_full(list_t* list) {
    return (list->size == MAX_SIZE);
}

bool_t __check_index(list_t* list, const int index) {
    return (index >= 0 && index <= list->size);
}

list_t* list_malloc() {
    return (list_t*)malloc(sizeof(list_t));
}

void list_init(list_t* list) {
    list->size = 0;
    list->items = (int*)malloc(MAX_SIZE * sizeof(int));
}

void list_free(list_t* list) {
    free(list->items);
}

int list_add(list_t* list, const int item) {
    if(__list_is_full(list)) {
        return -1;
    }
    list->items[list->size++] = item;
    return 0;
}

int list_get(list_t* list, const int index, int* result) {
    if (__check_index(list, index)) {
        *result = list->items[index];
        return 0;
    }
    return -1;
}

void list_clear(list_t* list) {
    list->size = 0;
}

size_t list_size(list_t* list) {
    return list->size;
}

void list_print(list_t* list) {
    printf("[");
    for (size_t i = 0; i<list->size; i++) {
        printf("%d,", list->items[i]);
    }
    printf("]");
    printf("\n");
}

这是我的 main.c 文件


#include "example6_3.h"

int reverse(list_t* source, list_t* dest) {
    list_clear(dest);
    for (size_t i = list_size(source)-1; i>=0; i--) {
        int item;
        if (list_get(source, i, &item)) {
            return -1;
        }
        list_add(dest, item);
    }
    return 0;
}

int main(void) {
    list_t* list1 = list_malloc();
    list_t* list2 = list_malloc();
    list_init(list1);
    list_init(list2);
    list_add(list1, 4);
    list_add(list1, 6);
    list_add(list1, 1);
    list_add(list1, 5);
    list_add(list2, 9);
    reverse(list1, list2);
    list_print(list1);
    list_print(list2);
    list_free(list1);
    list_free(list2);
    return 0;
}

看起来代码没有问题,也没有内存泄漏。为什么内存泄漏检查会报告内存泄漏?这个工具可靠吗?是因为我使用方式的原因吗?

各位高手,请帮我分析一下问题,以及如何防止报内存泄漏。

c memory memory-leaks valgrind
1个回答
0
投票

list_free()
释放列表的项目,但不释放列表。

那么

list_free(list1);
free(list1);

list_free(list2);
free(list2);
© www.soinside.com 2019 - 2024. All rights reserved.