C语言 当我知道这个程序大多数时候会泄漏什么时,我如何修复它的内存泄漏?



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

如果你想查看它,这里是代码:

#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()函数。这个泄漏可能与你的代码无关:还要解释你使用什么工具来检测内存泄漏。

对于巨大的向量大小,pointer->capacity * 3 / 4可能会导致整数溢出,这是一个小问题。此溢出可能导致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。

最新更新