繁体   English   中英

当我知道它在大多数情况下泄漏了什么时,如何修复该程序的 memory 泄漏?

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

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

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

#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);
}

代码看起来不错,您应该发布结构定义和main() function ,它显示了泄漏 泄漏可能与您的代码无关:还要说明您使用什么工具来检测 memory 泄漏。

对于大向量大小存在一个小问题,其中pointer->capacity * 3 / 4可能会导致 integer 溢出。 此溢出可能导致malloc()失败并返回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++;
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM