繁体   English   中英

释放双指针上的内存

[英]free up memory on a 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]); }

我希望这是一个隐式链接列表,有人知道我在做什么错吗?

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

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

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

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

问题是您:

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

因此,在最后一步,您释放了两次指针(因为p[3]p[4]的最后两个条目相同),从而导致未定义的行为。

您说您想要“一个隐式链接列表”,这意味着您正在尝试将指针填充到对象中(而不是像您正在做的那样填充到顶层数组中),在这种情况下,您需要以下内容:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM