char* 上的 free() 被 valgrind 识别为无效

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

我正在尝试释放 char** 数组中存在的 char* 指针,但 valgrind 确定此操作无效。

这是我正在做的一个简单示例:

struct building{
  int propertyPrice;
  int totalArea;
  char** floors;
}

int main(){

  struct building* B = malloc(sizeof(struct building));

  for(size_t i=0;i<10;i++)
    B->floors[i] = malloc(20 * sizeof(char*));

}

这就是我感到困惑的地方 - 我可以通过以下循环访问元素:

for(size_t i=0;i<10;i++)
    printf("%s", B->floors[i]); //assume that a valid string exists at each floors[i]!

我正在尝试释放分配的内存,如下所示:

for(size_t i=0;i<10;i++)
    free(B->floors[i]);

free(B);

请原谅缺少对 NULL 的 malloc() 检查,为了简洁起见,我将其删除。

Valgrind 确定操作

free(B->floors[i])
Invalid free() / delete / delete[] / realloc()
。然而,如果我可以通过
B-floors[i]
访问各个 char* 元素,我是否应该能够使用相同的语法通过将函数调用从
printf()
切换到
free()
来释放它(我的想法来自 这个 stackoverflow 答案)?

第二个

free()
通话工作得很好。

我的程序正在按预期执行,但我想摆脱内存泄漏 - 因此使用 valgrind。如果有帮助,我在执行 valgrind 时使用 gcc 的

-Werror -ggdb
开关和
--track-origins=yes --leak-check=full
参数。

c pointers malloc valgrind free
1个回答
0
投票

这里:

for(size_t i=0;i<10;i++)
    B->floors[i] = malloc(20 * sizeof(char*));

B->floors
未初始化即可使用。

不需要循环,只需在最后调用

B->floors = malloc(20 * sizeof(char*));
free(B->floors);
即可。

© www.soinside.com 2019 - 2024. All rights reserved.