【问题标题】:Should I use "free" on 2D array when I used realloc?当我使用 realloc 时,我应该在 2D 数组上使用“free”吗?
【发布时间】:2021-07-14 09:23:33
【问题描述】:

我有这样声明的二维数组:

int **array= NULL;

然后,我在代码的某处添加如下元素:

int* tempArray1D = FuncThatReturnsIntStarArray();
array= (int**)realloc(array, (arraySize+ 1) * sizeof(int*));
*(array+size - 1) = tempArray1D;

如果我想从 2D 数组中删除一个(最后一个)元素,我应该在一维数组 (int*) 上使用 free() 和 realloc 还是 realloac 来处理所有这些。 例如:

free(*(array+ size- 1));
array= (int**)realloc(array, (size- 1) * sizeof(int*));

或者只是:

array= (int**)realloc(array, (size- 1) * sizeof(int*));

free() 的示例会导致一些问题,我不确定这种避免内存泄漏的方法是否正确,并且我在代码中的其他地方还有其他错误,或者这只是一种不好的方法。

【问题讨论】:

  • 如果函数FuncThatReturnsIntStarArray 使用malloc 或其他动态分配,那么如果您不再需要分配的内存,您可能必须使用free。一般来说,建议先将realloc 的结果存储在一个临时变量中并检查返回码,例如tmp = realloc(array, (size- 1) * sizeof(int*)); if(tmp == NULL) { /* handle error */ } else { array = tmp; }
  • 我推荐使用下标运算符array[index] 而不是*(array+index)

标签: c memory-leaks free realloc


【解决方案1】:

realloc() 不知道你存储在空间中的东西。你需要自己照顾它们。

如果FuncThatReturnsIntStarArray() 分配了它返回地址的内存,并且如果您没有其他机制(如函数FuncThatFreesAllocatedArray()),则应该释放该内存。

(顺便说一句,FuncThatReturnsIntStarArray() 有点误导,因为它不返回 int "stars" (vulgo: pointers) 的数组。像 FuncThatReturnsPointerToInts() 这样的东西更合适。)

【讨论】:

    猜你喜欢
    • 2021-05-24
    • 2011-12-03
    • 2017-01-06
    • 2014-04-09
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    相关资源
    最近更新 更多