释放双指针上的内存

时间:2014-01-24 20:31:45

标签: c++ c malloc free double-pointer

//char char **p; declared in .h file
size_t bs = 5;
size_t Size = sizeof(obj);
p = (char**)malloc(bs);
for (size_t i = 0; i < bs;i++){p[i] = (char*)malloc(Size);}

for (size_t j = 0; j < bs-1; j ++){p[j] = &(p[j + 1][0]); }

for (size_t i = 0; i < bs; i++){free(p[i]);}

free(p);

我试图在for循环中释放p的最后一个元素时,代码停止了。我可能做错了什么?

编辑:即使将其更改为(char * )malloc(bs sizeof(char *)),我仍然遇到同样的问题;

这仍然不起作用:

size_t bs = 5;
size_t Size = sizeof(obj);
p = (char**)malloc(bs* sizeof(char *));
for (size_t i = 0; i < bs;i++){p[i] = (char*)malloc(Size);}
for (size_t j = 0; j < bs-1; j ++){p[j] = &(p[j + 1][0]); }
for (size_t i = 0; i < bs; i++){free(p[i]);}
free(p);

使用new而不是malloc也无法解决问题

然而,这段代码可以释放内存。

size_t bs = 5;
size_t Size = sizeof(obj);
p = (char**)malloc(bs* sizeof(char *));
for (size_t i = 0; i < bs;i++){p[i] = (char*)malloc(Size);}
for (size_t i = 0; i < bs; i++){free(p[i]);}
free(p);

所以问题似乎与这段代码有关

for(size_t j = 0; j < bs-1; j ++){p[j] = &(p[j + 1][0]); }

我希望这是一个隐含的链接列表,任何人都知道我在做错了什么?

3 个答案:

答案 0 :(得分:2)

您没有为指针分配足够的空间。改为

p = malloc(bs * sizeof(char*));

答案 1 :(得分:1)

在第一个malloc,你不需要5个字节,但需要5次指针。

p = (char**)malloc(bs * sizeof(char *));

答案 2 :(得分:1)

问题是你:

  • 分配一个包含5个指针的数组
  • 分配5个字符数组并将它们存储在第一个数组中
  • 在数组中向下移动这些指针,覆盖(并丢失)第一个指针并复制最后一个指针
  • 尝试释放数组中的5个指针。

所以在最后一步,你释放一个指针两次(因为p[3]p[4]的最后两个条目是相同的),导致未定义的行为。

你说你想要一个“隐式链接列表”,这意味着你正在尝试将指针填充到对象中(而不是像你正在做的那样进入顶层数组),在这种情况下你需要类似的东西: / p>

for(size_t j = 0; j < bs-1; j ++) { *(char **)p[j] = p[j + 1]); }
*(char **)p[bs-1] = 0;  // null terminate the linked list

这假定obj的定义类似于:

struct obj {
    struct obj *next;
    // more fields