大多数时候,当我知道它泄漏了什么时,我该如何修复该程序的内存泄漏?
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++;
}
所以,我有一个泄漏内存的动态数组,我几乎总能发现所有丢失的内存都在一个块中丢失,有时它没有泄漏任何东西。然而,我改变了一些东西,现在它总是泄漏,但它是一个可计算的总和(我认为它是我们在退出程序之前最后得到的数组的大小)。你能帮我解决这个问题吗?
如果您想查看代码,请查看以下代码:
#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++;
}