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

问题描述 投票:0回答:1

我问是因为我正在创建一个 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;
}
c pointers memory-management memory-leaks free
1个回答
1
投票

T你正在使用

realloc
来扩展数组:

  • 如果

    realloc
    成功,之前
    initialArray
    指向的对象已经被释放,所以你可以直接将新分配的对象存储到
    initialArray
    中。

  • 如果

    realloc
    失败,
    newArray
    NULL
    并且原始对象仍然被分配并且可以通过
    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(int) * arraySize);
    int scannedInt;

    if (!array) {
        fprintf(stderr, "allocation error\n");
        return NULL;
    }
    while (scanf("%d", &scannedInt) == 1) {
        printf("Scanned %d\n", scannedInt);
        if (arrayElementCount + 1 > arraySize) {
            int *newArray = realloc(array, sizeof(int) * (arraySize + SIZE_INCREMENT));
            if (newArray == NULL) {
                fprintf(stderr, "allocation error\n");
                free(newArray);
                return NULL;
            }
            array = newArray;
            arraySize += SIZE_INCREMENT;
        }
        array[arrayElementCount++] = scannedInt;
    }
    array[arrayElementCount] = 0;
    return array;
}
© www.soinside.com 2019 - 2024. All rights reserved.