C语言 我是否造成了内存泄漏以及如何修复它

cetgtptt  于 2023-04-29  发布在  其他
关注(0)|答案(1)|浏览(118)

我之所以这样做是因为我正在创建一个initialArray,但随后我将它指向一个新数组,而没有释放最初分配的空间。我尝试在将free(initialArray)指向我的newArray之前执行free(initialArray),所以我将释放以前使用的数组-它将像这样:

free(initialArray);
initialArray = newArray;

但我得到了一个核心转储有帮助吗?

#include <stdio.h>
#include <stdlib.h>

#define ENLARGE_SIZE(x, y) x += y
#define SIZE_INCREMENT 10

int *get_set();

int main() {
    int i = 0;
    int *set = get_set();
    printf("Array elements:\n");
    while (*(set + i) != '\0') {
        printf("%d,%d\n", *(set + i), i);
        i++;
    }
    free(set);
    return 1;
}

int *get_set() {
    int *initialArray = malloc(sizeof(int) * SIZE_INCREMENT);
    int arraySize = 5;
    int arrayElementCount = 0;
    int scannedInt;
    int i = 0;
    while (scanf("%d", &scannedInt) != EOF) {
        printf("Scanned %d\n", scannedInt);
        arrayElementCount++;
        if (arraySize == arrayElementCount) {
            int *newArray = realloc(initialArray, sizeof(int) * (ENLARGE_SIZE(arraySize, SIZE_INCREMENT)));
            initialArray = newArray;
            arraySize += SIZE_INCREMENT;
        }
        *(initialArray + i) = scannedInt;
        i++;
    }
    return initialArray;
}
vh0rcniy

vh0rcniy1#

您正在使用realloc扩展数组:

  • 如果realloc成功,则initialArray指向的前一个对象已被释放,因此您可以将新分配的对象直接存储到initialArray
  • 如果realloc失败,则newArrayNULL,并且原始对象仍然被分配并且可以通过initialArray访问。如果决定中止该函数,则可以释放它。

还要注意这些备注:

  • 语法*(set + i)的可读性不如等价的数组表达式set[i]。除非你被指示只使用前者,否则你更喜欢后者。
  • while (scanf("%d", &scannedInt) != EOF)不正确。您应该使用以下命令检查转换是否成功:
while (scanf("%d", &scannedInt) == 1)
  • get_set()应该在分配的数组末尾设置一个0值。通过指针返回元素的数量可能是一个好主意。
  • 你在get_set中对数组大小的处理是令人困惑的。把它简化成这样:
#define SIZE_INCREMENT 10

int *get_set(void) {
    int arraySize = SIZE_INCREMENT;
    int arrayElementCount = 0;
    int *array = malloc(sizeof(*array) * arraySize);
    int scannedInt;

    if (!array) {
        fprintf(stderr, "allocation error\n");
        return NULL;
    }
    while (scanf("%d", &scannedInt) == 1) {
        printf("Scanned %d\n", scannedInt);
        if (arrayElementCount + 2 > arraySize) {
            int *newArray = realloc(array, sizeof(*newArray) * (arraySize + SIZE_INCREMENT));
            if (!newArray) {
                fprintf(stderr, "allocation error\n");
                free(array);
                return NULL;
            }
            array = newArray;
            arraySize += SIZE_INCREMENT;
        }
        array[arrayElementCount++] = scannedInt;
    }
    array[arrayElementCount] = 0;
    return array;
}

相关问题