大多数时候,当我知道它泄漏了什么时,我该如何修复该程序的内存泄漏?

How can I fix the memory leaks of this program, when I know what it leaks, most of the times?

所以,我有一个泄漏内存的动态数组,我几乎总能发现所有丢失的内存都在一个块中丢失,有时它没有泄漏任何东西。然而,我改变了一些东西,现在它总是泄漏,但它是一个可计算的总和(我认为它是我们在退出程序之前最后得到的数组的大小)。你能帮我解决这个问题吗?

如果您想查看代码,请查看以下代码:

#include "DynamicVector.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

DynamicVector createDynamicVector() {
    DynamicVector dynamicVector;
    dynamicVector.number_of_elements = 0;
    dynamicVector.capacity = 2;
    dynamicVector.elements = (int *)malloc(dynamicVector.capacity * sizeof(int));
    return dynamicVector;
}

int isEmpty(DynamicVector *pointer) {
    if (pointer->number_of_elements == 0)
        return 1;
    return 0;
}

int search_element(DynamicVector *pointer, int element) {
    int index;
    for (index = 0; index < pointer->number_of_elements; index++) {
        if (pointer->elements[index] == element) {
            return index;
        }
    }
    return -1;
}

void resize_smaller(DynamicVector *pointer) {
    int *new_elements;
    new_elements = (int *)malloc((pointer->capacity * 3 / 4) * sizeof(int));
    memcpy(new_elements, pointer->elements, pointer->number_of_elements * sizeof(int));

    destroyDynamicVector(pointer);
    pointer->elements = new_elements;
    pointer->capacity = pointer->capacity * 3 / 4;
}

void resize_bigger(DynamicVector *pointer) {
    int *new_elements;
    new_elements = (int *)malloc(pointer->capacity * 2 * sizeof(int));
    memcpy(new_elements, pointer->elements, pointer->number_of_elements * sizeof(int));
    destroyDynamicVector(pointer);
    pointer->elements = new_elements;
    pointer->capacity = pointer->capacity * 2;
}

void add_element(DynamicVector *pointer, int element) {
    if (pointer->capacity == pointer->number_of_elements) {
        resize_bigger(pointer);
    }
    *(pointer->elements + pointer->number_of_elements) = element;
    pointer->number_of_elements++;
}

int remove_element(DynamicVector *pointer, int element) {
    int index_found = 0;
    index_found = search_element(pointer, element);
    if (index_found == -1) {
        return 1;
    }
    *(pointer->elements + index_found) = *(pointer->elements + pointer->number_of_elements - 1);
    pointer->number_of_elements--;
    if (pointer->number_of_elements < pointer->capacity / 2) {
        resize_smaller(pointer);
    }
    return 0;
}

void destroyDynamicVector(DynamicVector *pointer) {
    free(pointer->elements);
}

添加元素时,大小乘以 2,但删除元素时,大小保持 3/4。这意味着在添加一个元素并删除元素后,大小将是原始大小的 2*3/4=1.25。

代码看起来不错,您应该 post 结构定义和一个 main() 函数,显示 泄漏 。此 泄漏 可能与您的代码无关:另请说明您使用什么工具来检测内存泄漏。

巨大的矢量大小存在一个小问题,pointer->capacity * 3 / 4 可能会导致整数溢出。此溢出可能导致 malloc() 失败和 return NULL,在复制数组内容时提示未定义的行为。

您也可以使用 realloc() 而不是 malloc() 来调整大小,如果块可以就地调整大小,则可以节省一些复制:

int resize_bigger(DynamicVector *pointer) {
    size_t new_capacity = pointer->capacity * 2;
    int *new_elements = realloc(pointer->elements, new_capacity * sizeof(int));
    if (new_elements != NULL) {
        pointer->elements = new_elements;
        pointer->capacity = new_capacity;
        return 0;
    } else {
        return -1;
    }
}

void resize_smaller(DynamicVector *pointer) {
    size_t new_capacity = pointer->capacity - pointer->capacity / 4;
    int *new_elements = realloc(pointer->elements, new_capacity * sizeof(int));
    if (new_elements != NULL) {
        pointer->elements = new_elements;
        pointer->capacity = new_capacity;
    }
}

// return the element number or -1 in case of failure
int add_element(DynamicVector *pointer, int element) {
    if (pointer->capacity == pointer->number_of_elements) {
        if (resize_bigger(pointer))
            return -1;
    }
    pointer->elements[pointer->number_of_elements] = element;
    return pointer->number_of_elements++;
}